我需要在脚本中直接从PyPi安装一个包。 也许有一些模块或distutils(分发,pip等)功能,允许我只执行类似pypi.install('requests')的东西,请求将被安装到我的virtualenv中。


当前回答

为了有条件地安装多个确切版本的包,我一直在使用基于@Tanmay Shrivastava的回答的这个模式:

import sys
from subprocess import run, PIPE, STDOUT
import pkg_resources

def run_cmd(cmd):
    ps = run(cmd, stdout=PIPE, stderr=STDOUT, shell=True, text=True)
    print(ps.stdout)


# packages to be conditionally installed with exact version
required = {"click==8.0.1", "semver==3.0.0.dev2"}
installed = {f"{pkg.key}=={pkg.version}" for pkg in pkg_resources.working_set}
missing = required - installed

if missing:
    run_cmd(f'pip install --ignore-installed {" ".join([*missing])}')

其他回答

你可以用"install_requires"选项在你自己的包的setup.py中定义依赖模块。

如果您的包需要生成一些控制台脚本,那么您可以使用“console_scripts”入口点来生成将放置的包装器脚本 在“bin”文件夹中(例如你的virtualenv环境)。

官方推荐的从脚本安装包的方法是通过子进程调用pip的命令行接口。这里提供的大多数其他答案都不支持pip。此外,从pip v10开始,所有代码都转移到pip。正是为了让用户清楚地知道,不允许以编程方式使用PIP。

使用系统。以确保您将调用与当前运行时相关联的相同PIP。

import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])
import os
os.system('pip install requests')

我尝试了上述临时解决方案,而不是更改docker文件。希望这些可能对一些人有用

为了安装多个包,我使用了一个setup.py文件,代码如下:

import sys
import subprocess
import pkg_resources

required  = {'numpy', 'pandas', '<etc>'} 
installed = {pkg.key for pkg in pkg_resources.working_set}
missing   = required - installed

if missing:
    # implement pip as a subprocess:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', *missing])

这应该可以工作:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])