Python 的 setup.py 安装的 CLI 脚本不允许导入相同的模块
Python's setup.py installed CLI script doesn't allow importing same module
我想创建一个可以从 CLI 执行的名为 knife 的 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()
所以在使用 setup.py 安装模块后,我尝试 运行 knife-cli 但一直抛出这个错误:
$ 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'
到底发生了什么?我该如何解决?
您还需要一些 __init__
。 __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".
中包含您自己的脚本
这里有一个更好的 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,
entry_points={
'console_scripts': [
'knife-cli = knife.core.main:main'
]
},
zip_safe=False,
)
知道了,脚本正在执行旧的 /usr/bin/knife.pyc
文件,我刚刚删除了它,现在运行良好。
我想创建一个可以从 CLI 执行的名为 knife 的 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()
所以在使用 setup.py 安装模块后,我尝试 运行 knife-cli 但一直抛出这个错误:
$ 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'
到底发生了什么?我该如何解决?
您还需要一些 __init__
。 __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".
这里有一个更好的 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,
entry_points={
'console_scripts': [
'knife-cli = knife.core.main:main'
]
},
zip_safe=False,
)
知道了,脚本正在执行旧的 /usr/bin/knife.pyc
文件,我刚刚删除了它,现在运行良好。