![](/img/trans.png)
[英]ModuleNotFoundError with setup.py using a compiled pyc module
[英]ModuleNotFoundError using setup.py
我使用 python click package 和 setuptools 创建一个简单的命令行。 我在 pipenv virtualenv 工作。
我的工作目录是这样的:
jkt/脚本/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 的错误 No module named 'jkt'。
但是当 jkt 目录中的 app.py 时我可以运行我的函数
setup(
name='app',
version='0.1',
py_modules=['app'],
entry_points='''
[console_scripts]
app=app:jktools
''',
)
在我运行 pip install -e 之后。 我可以使用 app 命令来运行我的函数。
正如我所提到的,我无法重现您的错误(带有现代pip
Python 3.7 似乎工作得很好),但是在旧版本上有一些事情可能会出错。
由于看起来您没有将__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
足以创建它们pip install --upgrade setuptools
setuptools
因此pip install --upgrade setuptools
可能是必要的)用find_namespace_packages
(它识别 Python 3 时代的隐式命名空间包)替换您对find_packages
使用。find_packages
并直接列出包,例如用packages=['jkt', 'jkt.scripts'],
替换packages=find_packages(),
packages=['jkt', 'jkt.scripts'],
选项 #2 仅适用于 Python 3.3+,因此如果您的包打算在旧版本的 Python 上工作,请使用选项 #1 或 #3。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.