Python的Setup.py安装CLI脚本不允许导入同一模块



我想创建一个可以从CLI执行的python应用程序,问题是它无法导入模块。我遵循与Django项目相同的文件夹结构。

我的目录结构就是这样:

knife/
    knife/
        bin/
            knife-cli.py
        core/
            main/
                __init__.py
            __init__.py
        __init__.py
    setup.py

我的setup.py看起来像这样:

#!/usr/bin/env python
from setuptools import setup, find_packages
exclude = ['knife.bin']
setup(name='Knife',
      version='0.3',
      description='Very cool project',
      author='John Doe',
      author_email='author@email.com',
      packages=find_packages(exclude=exclude),
      include_package_data=True,
      scripts=['knife/bin/knife-cli.py'],
      entry_points={
        'console_scripts': [
            'knife-cli = knife.core.main:main'
        ]
      },
      zip_safe=False,
     )

我的knife/core/main/__init__.py包含一个main()功能,我的knife/bin/knife-cli.py看起来像:

#!/usr/bin/env python
from knife.core import main
if __name__ == "__main__":
    main.main()

因此,在使用设置安装模块后,我尝试运行刀具,但继续丢弃此错误:

$ knife-cli 
Traceback (most recent call last):
  File "/usr/bin/knife-cli", line 9, in <module>
    load_entry_point('Knife==0.3', 'console_scripts', 'knife-cli')()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 468, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2563, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2254, in load
    ['__name__'])
  File "/usr/bin/knife.py", line 4, in <module>
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 646, in run_script
    self.require(requires)[0].run_script(script_name, ns)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 1559, in run_script
    raise ResolutionError("No script named %r" % script_name)
pkg_resources.ResolutionError: No script named 'knife.py'

到底发生了什么?我该如何解决?

得到它,脚本正在执行旧的 /usr/bin/knife.pyc文件,我只是删除了它,现在运行良好。

您需要更多的__init__'S。__init__.py文件告诉Python,该文件夹是Python模块。您将它们重新列为设置脚本中的模块,因此您需要告诉Python它们是模块。

knife/
    knife/
        bin/
            knife-cli.py
        core/
            main/
                __init__.py
            __init__.py
        __init__.py
    setup.py

应该解决主要问题。但是,您还声明了两个脚本,一个使用scripts部分,另一个使用console_scripts。控制台脚本实际上将为您创建脚本,因此您无需将自己的脚本包括在" bin"中。

这是一个更好的设置。

#!/usr/bin/env python
from setuptools import setup, find_packages
exclude = ['knife.bin']
setup(name='Knife',
      version='0.3',
      description='Very cool project',
      author='John Doe',
      author_email='author@email.com',
      packages=find_packages(exclude=exclude),
      include_package_data=True,
      entry_points={
        'console_scripts': [
            'knife-cli = knife.core.main:main'
        ]
      },
      zip_safe=False,
     )

最新更新