安装 python 包后出现“ModuleNotFoundError”

Ped*_*ria 5 python pip package

问题总结

\n

我对 python 包开发非常陌生。我开发了一个包并将其发布在 TestPyPI 上。我安装这个包pip没有任何错误。然而,当我尝试导入 python 时,它给了我一个“ModuleNotFoundError”,我不知道为什么。有人能帮我吗?

\n

重现步骤

\n

首先,我使用以下命令安装该软件包:

\n
pip install -i https://test.pypi.org/simple/ spark-map==0.2.76\n
Run Code Online (Sandbox Code Playgroud)\n

然后,我打开一个新终端,启动 python 解释器,并尝试导入这个包,但是 python 给了我一个ModuleNotFoundError

\n
pip install -i https://test.pypi.org/simple/ spark-map==0.2.76\n
Run Code Online (Sandbox Code Playgroud)\n

我发现了什么

\n
    \n
  • 当我cd进入包的根文件夹并打开 python 解释器并运行时import spark_map,它工作正常,没有错误;

    \n
  • \n
  • pip没有成功安装软件包;不过我检查了这一点。安装软件包时,我没有收到任何错误消息,并且当我在命令pip list后运行时pip install,我spark_map在已安装软件包的列表中看到。

    \n
  • \n
\n
>>> import spark_map\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nModuleNotFoundError: No module named \'spark_map\'\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 安装的文件夹spark_map可以在Python的模块搜索路径之外;我也检查过这个。pip正在将包安装在名为 的文件夹中Python310\\lib\\site-packages,并且该文件夹包含在sys.path变量中:
  • \n
\n
>>> import sys\n>>> for path in sys.path:\n...     print(path)\n\nC:\\Users\\pedro\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip\nC:\\Users\\pedro\\AppData\\Local\\Programs\\Python\\Python310\\DLLs\nC:\\Users\\pedro\\AppData\\Local\\Programs\\Python\\Python310\\lib\nC:\\Users\\pedro\\AppData\\Local\\Programs\\Python\\Python310\nC:\\Users\\pedro\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\nC:\\Users\\pedro\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\win32\nC:\\Users\\pedro\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\win32\\lib\nC:\\Users\\pedro\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\Pythonwin\n
Run Code Online (Sandbox Code Playgroud)\n

有关系统的信息

\n

我在 Windows 10、Python 3.10.9 上,尝试安装并导入spark_map版本 0.2.76 的包。( https://test.pypi.org/project/spark-map/ )。

\n

有关代码的信息

\n

包源代码托管在 GitHub 上,该包的文件夹结构基本上是这样的:

\n
root\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80spark_map\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80__init__.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80functions.py\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80mapping.py\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80tests\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80functions\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80mapping\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80.gitignore\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80LICENSE\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80README.md\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80README.rst\n
Run Code Online (Sandbox Code Playgroud)\n

pyproject.toml包的文件:

\n
> pip list\n... many packages\nspark-map                0.2.76\n... more packages\n
Run Code Online (Sandbox Code Playgroud)\n

我尝试过的

\n

正如 @Dorian Turba 所建议的,我将源代码移动到一个src文件夹中。现在,包的结构是这样的:

\n
root\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80src\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80spark_map\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80__init__.py\n\xe2\x94\x82       \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80functions.py\n\xe2\x94\x82       \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80mapping.py\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80tests\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80.gitignore\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80LICENSE\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80pyproject.toml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80README.md\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80README.rst\n
Run Code Online (Sandbox Code Playgroud)\n

之后,我执行了python -m pip install -e .(该命令的日志如下图所示)。该包已编译并安装成功。但是,当我在不同的位置打开一个新终端并尝试运行时python -c "import spark_map",我仍然遇到相同的错误。

\n

在此输入图像描述

\n

我还尝试启动一个虚拟环境(使用python -m venv env),并在该虚拟环境中安装软件包(使用pip install -e .)。然后,我执行了python -c "import spark_map"。但问题仍然存在。我pip list也执行了,以检查软件包是否已安装。完整的命令日志如下图所示:

\n

在此输入图像描述

\n

Ped*_*ria 3

问题的根源

问题的根源在于包的“构建过程”。换句话说,pip install正在安装“无效的包”。

基本上,我使用 setuptools 来构建包。当我编译(或使用“构建”包)时python -m build,包的源代码(即目录的所有内容src)未包含在编译的 TAR 存档中。

使用安装工具修复

setuptools 的文档讨论了查找项目源代码的问题。本质上,setuptools 没有找到该包的源代码。所以我需要通过将这两个选项添加到我的pyproject.toml文件中来帮助他找到这些文件:

[tool.setuptools]
packages = ["spark_map"]
package-dir = {"" = "src"}
Run Code Online (Sandbox Code Playgroud)

您如何识别这个问题?

如果您在安装和导入软件包时遇到类似的问题,您可能会遇到同样的问题,就像我一样。要检查这是否是您的情况,请使用 构建您的项目python -m build。然后,打开包的源代码分发版(即 TAR 存档),并检查源代码是否位于此 TAR 文件内。如果没有,那么,你就遇到了这个问题。