Python 从 PyPI 安装时,CLI 应用程序不 运行,在本地安装时 运行 没问题
Python CLI application does not run when installed from PyPI, runs fine when installed locally
假设我正在开发一个名为 Example 的命令行应用程序,它的调用命令是 example
。我写了一个 setup.py 看起来像这样:
import setuptools
setuptools.setup(
name='example',
version='1.0',
entry_points = {
'console_scripts': [
'example=example.run:main'
]
},
...
)
此文件与名为 example
的模块(及其 __init__.py
和所有内容放在同一层。其中有一个 run.py
,其中有一个 main
函数。
当我使用...将这个正在进行的项目安装为符号链接时...
pip3 install -e .
...它工作正常。我可以使用 example
命令从任何地方 运行 它。
但是当我按照these instructions将它上传到PyPI,然后使用...
安装它
pip3 install example
...它说...
Traceback (most recent call last):
File "/usr/local/bin/example", line 7, in <module>
from example.run import main
ModuleNotFoundError: No module named 'example'
当然项目实际上并没有被调用example
;与它的名字没有任何冲突。
如果您想从文件 example.py
安装模块 example
,您
需要将其作为 Python 模块添加到 setup.py
:
setuptools.setup(
…
py_modules=['example'],
…
)
如果 example
是来自目录 example/
的包
需要将其添加为一个包:
setuptools.setup(
…
packages=['example'],
…
)
如果 example
有来自 example/*/
个子目录的子包,你
需要列出所有子包:
setuptools.setup(
…
packages=['example', 'example.sub1', 'example.sub2'],
…
)
您可以setuptools
列出您的所有子包:
setuptools.setup(
…
packages=setuptools.find_packages()
…
)
假设我正在开发一个名为 Example 的命令行应用程序,它的调用命令是 example
。我写了一个 setup.py 看起来像这样:
import setuptools
setuptools.setup(
name='example',
version='1.0',
entry_points = {
'console_scripts': [
'example=example.run:main'
]
},
...
)
此文件与名为 example
的模块(及其 __init__.py
和所有内容放在同一层。其中有一个 run.py
,其中有一个 main
函数。
当我使用...将这个正在进行的项目安装为符号链接时...
pip3 install -e .
...它工作正常。我可以使用 example
命令从任何地方 运行 它。
但是当我按照these instructions将它上传到PyPI,然后使用...
安装它pip3 install example
...它说...
Traceback (most recent call last):
File "/usr/local/bin/example", line 7, in <module>
from example.run import main
ModuleNotFoundError: No module named 'example'
当然项目实际上并没有被调用example
;与它的名字没有任何冲突。
如果您想从文件 example.py
安装模块 example
,您
需要将其作为 Python 模块添加到 setup.py
:
setuptools.setup(
…
py_modules=['example'],
…
)
如果 example
是来自目录 example/
的包
需要将其添加为一个包:
setuptools.setup(
…
packages=['example'],
…
)
如果 example
有来自 example/*/
个子目录的子包,你
需要列出所有子包:
setuptools.setup(
…
packages=['example', 'example.sub1', 'example.sub2'],
…
)
您可以setuptools
列出您的所有子包:
setuptools.setup(
…
packages=setuptools.find_packages()
…
)