我可以在子模块中放置Python控制台脚本吗?

时间:2016-04-15 21:14:36

标签: python setuptools

我有一个名为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,它也会有效。

如何使子模块配置正常工作?

1 个答案:

答案 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包并且入口点应该可以解析。