如何修复列出的已安装软件包的“ ModuleNotFoundError”?

时间:2019-07-16 10:27:36

标签: python pip install

我尝试导入同事所做的已安装软件包失败,并且出现错误ModuleNotFoundError: No module named 'package_name'。我已经使用sudo pip install .python -m sudo pip install在存储setup.py文件的目录中安装了它。

我在Ubuntu 16上运行,使用的是Anaconda的Python 3.6.8和PyPi 19.1.1。

安装需求之后,在包含setup.py文件的目录中,我正在运行sudo pip install,其输出为:

Processing /home/ubuntu/package_name
Building wheels for collected packages: package_name
  Building wheel for package_name (setup.py) ... done
  Stored in directory: /home/ubuntu/.cache/pip/wheels/f7/a5/d4/fb98a22a44dd721b6fba8d7f253fe10fd7a3a0747437b70a9f
Successfully built package_name
Installing collected packages: package_name
Successfully installed package_name-0.1

如果我使用pip listconda list列出了已安装的软件包,则会在输出中看到软件包名称。在第二种情况下,它被列为:

package_name                     0.1                      pypi_0    pypi

尽管如上所述,我无法使用import package_name在Python上导入包,也没有从终端或脚本中运行它。

此外,运行pip show --files package_name可以得出:

Name: package_name
Version: 0.1
# ...
Location: /home/ubuntu/anaconda3/lib/python3.6/site-packages
Requires: 
Required-by: 
Files:
  scripts/__init__.py
  scripts/__pycache__/__init__.cpython-36.pyc
  scripts/__pycache__/apply.cpython-36.pyc
  # ...
  scripts/apply.py
  scripts/config.py
  # ...
  package_name-0.1.dist-info/INSTALLER
  package_name-0.1.dist-info/METADATA
  package_name-0.1.dist-info/RECORD

我们正在使用的setup.py文件是:

import setuptools

with open("README.md", "r") as fh:
    long_description = fh.read()

setuptools.setup(
    name="package_name",
    version="0.1",
    author="Team",
    #author_email="author@example.com",
    description="our description",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://gitlab.example",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "Operating System :: OS Independent",
    ],
)

已经有几个人使用过该模块,而我是第一个解决此问题的人。这就是为什么我认为问题可能出在机器上的安装而不是模块本身中的原因。

1 个答案:

答案 0 :(得分:0)

这里有两种可能的解释,其中一种或两种都会导致package_name的导入失败。

首先,程序包名称和模块名称不一定相同。。 setup.py文件仅提取当前目录中的所有软件包:

packages=setuptools.find_packages()

,因此您需要查找其中包含__init__.py文件的目录。 那些已安装。

为说明起见,beautifulsoup4 project安装了bs4软件包。您无法导入beautifulsoup4,只有bs4是可导入的。

您可以使用pip show --files ...检查该软件包安装了哪些文件:

pip show --files package_name

相对于:元数据,此输出包的元数据(添加了Location的字段名,后跟它们的值)以及与安装相关的所有文件值。您将以package_name-0.1.dist-info/...的形式找到文件,但在一个或多个顶级目录中也应该有Python文件。其中包含__init__.py文件的顶级目录名称是可导入的程序包。

再次以beautifulsoup4项目为例,请注意输出中没有 beautifulsoup4/__init__.py文件,并且只有bs4/__init__.py存在,因为顶级包导入! beautifulsoup4-4.7.1.dist-info/...文件在.dist-info目录中形成软件包元数据,而不是要导入的软件包名称:

$ pip show --files beautifulsoup4
Name: beautifulsoup4
Version: 4.7.1
# ...
Location: /.../lib/python3.8/site-packages
Requires: soupsieve
Required-by: bs4
Files:
  beautifulsoup4-4.7.1.dist-info/AUTHORS
  beautifulsoup4-4.7.1.dist-info/COPYING.txt
  beautifulsoup4-4.7.1.dist-info/INSTALLER
  beautifulsoup4-4.7.1.dist-info/LICENSE
  beautifulsoup4-4.7.1.dist-info/METADATA
  beautifulsoup4-4.7.1.dist-info/RECORD
  beautifulsoup4-4.7.1.dist-info/WHEEL
  beautifulsoup4-4.7.1.dist-info/top_level.txt
  bs4/__init__.py
  bs4/__pycache__/__init__.cpython-38.pyc
  bs4/__pycache__/dammit.cpython-38.pyc
  bs4/__pycache__/diagnose.cpython-38.pyc
  bs4/__pycache__/element.cpython-38.pyc
  bs4/__pycache__/testing.cpython-38.pyc
  bs4/builder/__init__.py
  # ... more files ...

接下来,您可能使用pip命令以与python命令不同的Python版本安装软件包。您还需要仔细检查输出中的Location字段,因为它会向您显示此软件包与Python的安装方式

在上面的beautifulsoup4示例中,Location:标头告诉我我正在查看Python 3.8b2的安装;我可以通过运行site模块将其与Python命令进行交叉引用:

$ python -m site
/.../lib/python3.8/site.py:165: DeprecationWarning: 'U' mode is deprecated
  f = open(fullname, "rU")
sys.path = [
    '/...',.
    '/.../lib/python38.zip',
    '/.../lib/python3.8',
    '/.../lib/python3.8/lib-dynload',
    '/.../opt/lib/python3.8',
    '/.../lib/python3.8/site-packages',
]
# ...

这告诉我Location:项目的beautifulsoup4字段中命名的目录是在我的Python sys.path列表中配置的目录的一部分,因此可以预期{{1} }。

但是,如果import bs4信息 Location的输出不匹配,那么您使用的python -m site命令实际上并没有在相同的Python安装。在这种情况下,请使用:

pip

,而不只是普通的python -m pip install ... 。上面的命令绝对确保您使用的是pip命令所连接的pip版本,因此将使用相同的路径配置。

您的特定情况下python输出告诉您pip show --files package_name项目安装了package_name软件包:

script