Skip to main content
 首页 » 编程设计

python之为什么pip会跳过requirements.txt中的括号包

2024年08月14日28birdshome

我有一个requirements.txt如下

boxsdk 
boxsdk[jwt] 

如果我运行 pip install -r requirements.txt,那么只会安装 boxsdk,而不是 boxsdk[jwt]

# cat requirements.txt  
boxsdk 
boxsdk[jwt] 
# pip -q install -r requirements.txt  
# python -c "import boxsdk.auth.jwt_auth" 
Traceback (most recent call last): 
  File "<string>", line 1, in <module> 
  File "/usr/local/lib/python3.7/site-packages/boxsdk/auth/jwt_auth.py", line 10, in <module> 
    from cryptography.hazmat.backends import default_backend 
ModuleNotFoundError: No module named 'cryptography' 

但是,如果我删除第一行,以便只有 boxsdk[jwt] 列在 requirements.txt 中,它就会正确安装

# cat requirements.txt  
boxsdk[jwt] 
# pip -q install -r requirements.txt  
# python -c "import boxsdk.auth.jwt_auth" 
# 

可以在这里看到完整的 pip 输出:https://gist.github.com/davidkazuhiro/989328734e128628dd53ccab741f3e45

为什么 boxsdk[jwt] 在前一种情况下被跳过?

请您参考如下方法:

你的requirements.txt等同于下面的命令

pip install boxsdk boxsdk[jwt] 

所以我的回答将基于上述命令。

根据 What do square brackets mean in pip install? , boxsdk[jwt] 指定 boxsdk 包的变体。

因为您首先指定了 boxsdk,所以在遍历 boxsdk[jwt] 时,pip 注意到 boxsdk 已经在命令行(或一个相同的 requirements.txt),并默默地忽略重复的包规范。

另一方面,此命令成功安装了所有内容:

pip install boxsdk[jwt] boxsdk 

因此,您应该将带有 jwt 的那个放在 requirements.txt 中的另一个之前:

boxsdk[jwt] 
boxsdk 

这样,pip 将忽略后者并按需要安装。

但正确的方法是扔掉另一个,让 boxsdk[jwt] 成为你的 requirements.txt 中唯一的东西。