我在使用setup.py
安装python包时遇到了一个问题。首先,我有以下目录设置:
maindir
|- setup.py
|-mymodule
|- __init__.py
|- mainmodule.py
|-subdir
|- __init__.py
|- submodule.py
例如,项目目录包含setup.py
和目录mymodule
,该目录本身包含两个目录中的两个python模块。文件submodule.py
仅包含
teststring = "hello world"
mainmodule.py
包含:
from .subdir import submodule
mainstring = "42"
setup.py
包含:
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
安装这个‘包’并尝试执行相同的操作(从其他目录中)时,我得到一个导入错误:
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 tutorial和rules for importing intra-packages。我想我的错误真的很小,但我找不到它,感谢你的帮助。
发布于 2013-03-13 01:32:02
您必须列出setup
中的所有包,包括子包:
setup(
name = "mytestmodule",
version = "0.0.1",
description = ("A simple module."),
packages=['mymodule', 'mymodule.subdir'],
)
或者,您可以使用setuptools
的神奇函数find_packages
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包相对应。)
发布于 2015-05-11 02:17:55
您需要显式地指定每个模块。您可以使用setuptools
中的find_packages
方法,而不是保持每次都向setup.py添加模块的复杂性。
find_packages
有两个可选参数:
where
,默认为'.'
,即您的curdir。要排除的
exclude
材料列表我通常在我的存储库中有测试,所以我使用:
from setuptools import find_packages
packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
https://stackoverflow.com/questions/15368054
复制相似问题