0

我正在创建一个 python 3.9 程序并希望在本地安装包。所以我的项目设置方式是这样的:

__main__.py
test.py
requirements.txt
lib/
    __init__.py

在我的 requirements.txt 文件中,我有 3 行:

colorama==0.2.2
click==8.0.3
pendulum==2.1.2

然后我运行:python -m pip install -r requirements.txt -t ./lib 这会在 lib 目录中安装所有包和依赖项。

然后我在 test.py 文件的顶部导入模块:

from lib import colorama
from lib import click
from lib import pendulum

在进行一些测试时,我发现 colorama 工作正常。我将在一个简单的测试中使用它: print(colorama.Fore.BLUE + "Hello, World!"). 控制台中的文本为蓝色,一切正常。

然后我尝试使用其他包,我得到 ModuleNotFoundError 异常: print(pendulum.now('Europe/Paris'))

Exception has occurred: ModuleNotFoundError - No module named 'pendulum' 这来自它自己的文件之一。

当我使用 Click 时也会发生同样的事情,但它有点不同。我会得到相同的 ModuleNotFound 异常,但它是因为它自己对 Colorama 的依赖。我不认为这与我也在导入 Colorama 的事实有关,因为如果我卸载我会得到同样的错误。

我也用 python-docx 包试过这个。我将 python-docx==0.8.11 添加到 requirements.txt 文件中,然后发出与上面相同的命令以安装到我的本地 lib 目录。它似乎安装得很好。我看到了 docx 目录及其所有依赖项。然后我导入from lib import docx然后在 test.py 中做一些简单的事情: doc = docx.Document()

然后得到 ModuleNotFound 错误:文件 "C:\Users\name\Development\python\test-local-package\lib\docx_ init _.py", line 3, in (Current frame) No Module named 'docx'

有谁知道我做错了什么?

4

1 回答 1

0

当您将这些库放入您的lib文件夹并按照您的方式导入它们时,您正在更改它们的包名称。不再是colorama顶级包,现在是lib.colorama. 一些库可能对此没问题,但对于其他库,他们希望能够使用其正常名称导入自己的代码。如果colorama.some_submodule尝试import colorama,它将失败。

重要的是要意识到这样的声明from lib import colorama不会改变colorama随处可见的方式。它只更改本地命名空间。包仍然是lib.colorama,我们只是将它绑定到colorama当前模块中的名称。

正如 JonSG 在评论中所建议的那样,更好的解决方案是将lib文件夹放入 Python 搜索路径,以便import colorama找到具有正常名称的包。修改sys.path是一种方法,另一种是PYTHONPATH环境变量(可能不适合您当前的问题,但有时在其他情况下很有用)。

于 2021-10-16T00:19:47.127 回答