使用setup.py的ModuleNotFoundError

时间:2019-02-22 03:19:19

标签: python

我使用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命令运行我的功能。

1 个答案:

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

  1. 创建空的__init__.py文件以将这些文件夹明确标记为包文件夹;在类似UNIX的系统上,touch jkt/__init__.pytouch jkt/scripts/__init__.py足以创建它们
  2. 仅适用于Python 3.3+ :(还需要现代的setuptools,因此可能需要pip install --upgrade setuptools)将您对find_packages的使用替换为find_namespace_packages (which recognizes Python 3 era implicit namespace packages)
  3. 完全摆脱find_packages并直接列出软件包,例如将packages=find_packages(),替换为packages=['jkt', 'jkt.scripts'],

选项#2仅在Python 3.3+上有效,因此,如果您的软件包打算在旧版本的Python上运行,请选择选项#1或#2。