python-3.x - 在本地安装 python 包并不总是有效
问题描述
我正在创建一个 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'
有谁知道我做错了什么?
解决方案
当您将这些库放入您的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
环境变量(可能不适合您当前的问题,但有时在其他情况下很有用)。
推荐阅读
- python - Statsmodels AutoRegression 回测代码有效性
- django - 如何过滤指向自身的外键
- python - 当数据有点混乱时使用 datetime.strptime :额外的空格,一月或一月
- javascript - 使用 Jquery 更改 HTML 表格背景
- r - ggplot boxplot - 无法让我的情节工作,没有绘制“盒子”
- android - Flutter syncfusion_flutter_calendar如何获取特定日期的约会列表
- azure - 想在 azure AD 中获得过去 30 天来宾帐户的最后一次登录
- css - 在 Scss 中的 @if 内使用 CSS 变量
- php - php get_headers 对于我可以输入浏览器的 URL 失败
- javascript - 在发送给 Datadog 的 k6 指标中包含测试运行 ID