如何使用pip命令从requirements.txt文件升级我所有的python包?
尝试以下命令
$ pip install --upgrade -r requirements.txt
因为python包的后缀是版本号(Django==1.5.1),所以它们似乎不会升级。有没有比手动编辑requirements.txt文件更好的方法?
EDIT
正如Andy在他的回答中提到的,包被固定到特定的版本,因此不可能通过pip命令升级包。
但是,我们可以使用以下命令使用pip-tools实现这一点。
$ pip-review --auto
这将自动升级requirements.txt中的所有包(确保使用PIP install命令安装PIP -tools)。
我也不得不这么做……使用下面的一行小代码来完成这项工作:
packages=$(cat requirements.txt | sed 's/==.*//g'); echo $packages | xargs pip3 install -U; freeze=$(pip3 freeze); for p in $(echo $packages); do echo $freeze | grep -E "^${p}==" >> requirements.new; done
哪一个:
packages=$(cat requirements.txt | sed 's/==.*//g') creates a list of the current packages names in requirements.txt (removing the version).
echo $packages | xargs pip3 install -U then passes all of the packages as arguments to pip3 to upgrade.
freeze=$(pip3 freeze); Gets all of the current package versions in the format required for requirements.txt
for p in $(echo $packages) then iterates through the package names
echo $freeze | grep -E "^${p}==" >> requirements.new gets the package version line from the pip freeze output which matches the package and writes to new requirements.txt
这样做还有一个额外的好处,那就是保留原始requirements.txt的顺序。:)
希望这能有所帮助!
因为我不能用bash来做这个,我写了一个python模块来创建一个新的没有版本的需求文件并使用它:
data = open('requirements-prod.pip', 'r')
data2 = open('requirements-prod-no-version.pip', 'w')
for line in data.readlines():
new_line = line[:line.index('==')]
data2.write(new_line + '\n')
data2.flush()
然后从新文件pip install -U -r requirements-prod-no-version.pip中安装这些库
最后将版本冻结到原始文件pip freeze > requirements-prod.pip