首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用setup.py导入已安装的软件包时出错

使用setup.py导入已安装的软件包时出错
EN

Stack Overflow用户
提问于 2013-03-13 01:29:29
回答 2查看 25.6K关注 0票数 31

我在使用setup.py安装python包时遇到了一个问题。首先,我有以下目录设置:

代码语言:javascript
复制
maindir
   |- setup.py
   |-mymodule
         |- __init__.py
         |- mainmodule.py
         |-subdir
             |- __init__.py
             |- submodule.py

例如,项目目录包含setup.py和目录mymodule,该目录本身包含两个目录中的两个python模块。文件submodule.py仅包含

代码语言:javascript
复制
teststring = "hello world"

mainmodule.py包含:

代码语言:javascript
复制
from .subdir import submodule
mainstring = "42"

setup.py包含:

代码语言:javascript
复制
import os
from setuptools import setup
setup(
    name = "mytestmodule",
    version = "0.0.1",
    description = ("A simple module."),
    packages=['mymodule'],
)

当我在sourceTest中使用ipython执行from mymodule import mainmodule时,行为如预期的那样工作,我可以引用例如mainmodule.submodule.teststring,它给了我字符串hello world

另一方面,当我使用python setup.py install安装这个‘包’并尝试执行相同的操作(从其他目录中)时,我得到一个导入错误:

代码语言:javascript
复制
In [1]: from mymodule import mainmodule
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
/home/alexander/<ipython-input-1-cf4c9bafa487> in <module>()
----> 1 from mymodule import mainmodule

/home/alexander/build/bdist.linux-i686/egg/mymodule/mainmodule.py in <module>()

ImportError: No module named subdir

我看不出我做错了什么,因为我遵循了Getting started tutorialrules for importing intra-packages。我想我的错误真的很小,但我找不到它,感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-13 01:32:02

您必须列出setup中的所有包,包括子包:

代码语言:javascript
复制
setup(
    name = "mytestmodule",
    version = "0.0.1",
    description = ("A simple module."),
    packages=['mymodule', 'mymodule.subdir'],
)

或者,您可以使用setuptools的神奇函数find_packages

代码语言:javascript
复制
from setuptools import setup, find_packages
setup(
    name = "mytestmodule",
    version = "0.0.1",
    description = ("A simple module."),
    packages=find_packages(),
)

这是提到的here

如果您有子包,它们必须显式地列在包中,但是package_dir中的任何条目都会自动扩展到子包。(换句话说,Distutil不会扫描源代码树,而是试图通过查找__init__.py文件来找出哪些目录与Python包相对应。)

票数 49
EN

Stack Overflow用户

发布于 2015-05-11 02:17:55

您需要显式地指定每个模块。您可以使用setuptools中的find_packages方法,而不是保持每次都向setup.py添加模块的复杂性。

find_packages有两个可选参数:

  1. where,默认为'.',即您的curdir。要排除

  • exclude材料列表

我通常在我的存储库中有测试,所以我使用:

代码语言:javascript
复制
from setuptools import find_packages

packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15368054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档