我在使用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'],
)
当我从from mymodule import mainmodule
内ipython
sourceTest
时,行为按预期工作,我可以参考,例如mainmodule.submodule.teststring
,它为我提供了字符串hello world
。
另一方面,当我使用python setup.py install
安装此'package'并尝试执行相同操作时(从其他目录中),我收到导入错误:
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时,我看不出我做错了什么。我想我的错误是一个非常小的错误,但我无法发现它并且感谢帮助。
答案 0 :(得分:41)
您必须列出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中的任何条目都会自动扩展到子包。 (换句话说, Distutils不扫描您的源树,尝试 找出哪些目录对应于Python包 寻找
__init__.py
个文件。)
答案 1 :(得分:6)
您需要明确指定每个模块。您可以使用find_packages
中的setuptools
方法,而不是每次都保持向setup.py添加模块的复杂性。
find_packages
有两个可选参数:
where
默认为'.'
,即你的curdir。 exclude
要排除的内容列表我通常在我的仓库中进行测试,所以我使用:
from setuptools import find_packages
packages=find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
答案 2 :(得分:0)
我的setup.py console_scripts中有scriptname.py:main
,.py
是多余的。