我尝试导入同事所做的已安装软件包失败,并且出现错误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 list
或conda 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",
],
)
已经有几个人使用过该模块,而我是第一个解决此问题的人。这就是为什么我认为问题可能出在机器上的安装而不是模块本身中的原因。
答案 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