繁体   English   中英

使用 setup.py 的 ModuleNotFoundError

[英]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[] )。 您可以通过以下三种方式之一解决此问题:

  1. 创建空的__init__.py文件以明确地将这些文件夹标记为包文件夹; 在类 UNIX 系统上, touch jkt/__init__.pytouch jkt/scripts/__init__.py足以创建它们
  2. 仅适用于 Python 3.3+:(也需要现代pip install --upgrade setuptools setuptools因此pip install --upgrade setuptools可能是必要的)用find_namespace_packages (它识别 Python 3 时代的隐式命名空间包)替换您对find_packages使用。
  3. 只需完全摆脱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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM