我使用python click包和setuptools创建一个简单的命令行。 而且我在pipenv virtualenv中工作。
我的工作目录是这样的:
jkt / scripts / app.py
我的setup.py是这样的:
from setuptools import setup, find_packages
setup(
name='jkt',
version='0.1',
packages=find_packages(),
include_package_data=True,
entry_points='''
[console_scripts]
jktool=jkt.scripts.app:somefunction
''',
)
然后我运行命令
pip install --editable .
并运行jktool来执行myfunction,但它显示名为ModuleNotFoundError的错误,没有名为'jkt'的模块。
但是当jkt目录中的app.py我可以运行我的功能
setup(
name='app',
version='0.1',
py_modules=['app'],
entry_points='''
[console_scripts]
app=app:jktools
''',
)
运行pip install -e之后。我可以使用app命令运行我的功能。
答案 0 :(得分:0)
As I mentioned,我无法重现您的错误(带有现代pip
的Python 3.7看起来很好用),但是在旧版本中可能有几处可能出错。< / p>
由于看起来好像没有将__init__.py
文件放在子目录中,因此find_packages
实际上根本找不到任何包(python3 -c 'from setuptools import find_packages; print(find_packages())
打印出空的list
,[]
)。您可以通过以下三种方法之一来解决此问题:
__init__.py
文件以将这些文件夹明确标记为包文件夹;在类似UNIX的系统上,touch jkt/__init__.py
和touch jkt/scripts/__init__.py
足以创建它们setuptools
,因此可能需要pip install --upgrade setuptools
)将您对find_packages
的使用替换为find_namespace_packages
(which recognizes Python 3 era implicit namespace packages)。find_packages
并直接列出软件包,例如将packages=find_packages(),
替换为packages=['jkt', 'jkt.scripts'],
选项#2仅在Python 3.3+上有效,因此,如果您的软件包打算在旧版本的Python上运行,请选择选项#1或#2。