为什么pip跳过了requirements.txt中的括号包?

时间:2019-02-03 06:51:25

标签: python pip

我有一个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"
#

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

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

1 个答案:

答案 0 :(得分:1)

您的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中唯一的东西。