我有一个名为cmdline
的Python包。我使用setuptools
来定义控制台入口点。我想将此入口点放在cli
子模块中,但是当我尝试运行已安装的脚本时出现错误。
我的项目布局如下所示。
setup.py
cmdline/
__init__.py
cli/
__init__.py
main.py
setup.py
看起来像这样。
from setuptools import setup
setup(
name='cmdline',
version='1.0.0',
packages=['cmdline'],
url='',
license='',
author='W.P. McNeill',
author_email='',
description='',
entry_points={
'console_scripts': ['cmdline=cmdline.cli.main:main'],
}
)
main.py
文件看起来像这样。
def main():
print("Hello, world")
if __name__ == "__main__":
main()
两个__init__.py
个文件都是空的。
如果我使用python setup.py install
安装它,然后尝试运行控制台脚本,则会出错。
> cmdline
Traceback (most recent call last):
File "//anaconda/envs/cmdline/bin/cmdline", line 9, in <module>
load_entry_point('cmdline==1.0.0', 'console_scripts', 'cmdline')()
File "build/bdist.macosx-10.5-x86_64/egg/pkg_resources/__init__.py", line 542, in load_entry_point
File "build/bdist.macosx-10.5-x86_64/egg/pkg_resources/__init__.py", line 2569, in load_entry_point
File "build/bdist.macosx-10.5-x86_64/egg/pkg_resources/__init__.py", line 2229, in load
File "build/bdist.macosx-10.5-x86_64/egg/pkg_resources/__init__.py", line 2235, in resolve
ImportError: No module named cli.main
但是,如果我通过带有python setup.py develop
的软链接进行安装,则可以正常使用。
> cmdline
Hello, world
如果我没有使用cli
子模块并且在项目的顶层只有main.py
,它也会有效。
如何使子模块配置正常工作?
答案 0 :(得分:2)
您的setup.py不包含cmdline.cli
子包,只会包含cmdline
个包。 setuptools不会递归添加所有子包,您需要显式指定所有包,或使用find_packages()
函数执行此操作:
from setuptools import setup, find_packages
setup(
name='cmdline',
version='1.0.0',
packages=find_packages(),
# or:
# packages=['cmdline', 'cmdline.cli']
url='',
license='',
author='W.P. McNeill',
author_email='',
description='',
entry_points={
'console_scripts': ['cmdline=cmdline.cli.main:main'],
}
)
之后,将安装cmdline.cli
包并且入口点应该可以解析。