我的问题与此问题有关:Installing python module within code,但涉及升级模块。
我已经尝试了
packages=['apscheduler','beautifulsoup4','gdata']
def upgrade(packages):
for package in packages:
pip.main(['install --upgrade', package])
和
def upgrade(packages):
for package in packages:
pip.main(['install', package + ' --upgrade'])
答案 0 :(得分:13)
尝试pip.main(['install', '--upgrade', package])
。
“ - upgrade”是一个单独的命令行参数,因此您需要将其单独传递给main
。
答案 1 :(得分:1)
BrenBarn's answer符合OP代码的风格,但Richard Wheatley's answer更接近我的代码。
理查德的答案有几个我想解决的问题,但我不想编辑他,因为差异相当大。
from subprocess import call
my_packages = ['apscheduler', 'beautifulsoup4', 'gdata']
def upgrade(package_list):
call(['pip', 'install', '--upgrade'] + package_list)
注意:
pip
模块(subprocess
调用其路径中找到的pip
二进制文件)shell=True
(和其他call()
函数)中不必要地使用subprocess
,it puts responsibility on the programmer to protect against shell injection vulnerabilities。 (这里不是一个问题,但作为一般规则是好的。)pip install
的单个调用接受任意数量的包名称,--upgrade
的一次使用将适用于所有这些名称。答案 2 :(得分:0)
我现在这是一个老线程,但我已经遇到过很多次了,我想我应该给出另一个解决方案,因为我已经使用过这个。对我而言,这更加用户友好。
import pip
from subprocess import call
packages=['apscheduler','beautifulsoup4','gdata']
def upgrade(packages):
for package in packages:
call("pip install --upgrade " + package, shell=True)
阅读以下Actual meaning of 'shell=True' in subprocess帖子后,似乎不需要shell = True命令,这可能不是最好的主意。
我不需要import pip
,因为我之前的答案中没有看到pip.main
。
所以新代码可能是: 来自子进程导入调用
packages=['apscheduler','beautifulsoup4','gdata']
def upgrade(packages):
for package in packages:
call("pip install --upgrade " + package)
至于其他答案,我更喜欢传递特定的字符串和循环。 使用任何一种方法都不会获得性能损失或增益。