如何从需要它的脚本中安装缺少的python包?

sor*_*rin 13 python pip

假设您已经在python发行版上安装了pip或easy_install,我想知道如何在脚本本身内的用户目录中安装所需的包.

据我所知,pip也是一个python模块,所以解决方案看起来像:

try:
    import zumba
except ImportError:
    import pip
    # ... do "pip install --user zumba" or throw exception   <-- how?
    import zumba
Run Code Online (Sandbox Code Playgroud)

我缺少的是从python内部执行"pip install --user zumba",我不想使用它,os.system()因为这可能会产生其他问题.

我认为有可能......

sor*_*rin 17

感谢@Joop,我能够提出正确的答案.

try:
    import zumba
except ImportError:
    from pip._internal import main as pip
    pip(['install', '--user', 'zumba'])
    import zumba
Run Code Online (Sandbox Code Playgroud)

一个重要的注意事项是,这将在不需要root访问权限的情况下工作,因为它将在用户目录中安装模块.

不确定它是否适用于二进制模块或需要编译的模块,但它显然适用于纯python模块.

现在,您可以编写自包含脚本,而不必担心依赖项.

  • 我已针对较新的 pip 版本更新了此答案。希望它没问题,因为它不会改变答案的精神,只是改变方法的位置。 (2认同)

Pho*_*nix 9

从pip版本> = 10.0.0开始,由于内部包重构,上述解决方案将无效.在脚本中使用pip的新方法现在如下:

try: import abc
except ImportError:
    from pip._internal import main as pip
    pip(['install', '--user', 'abc'])
    import abc
Run Code Online (Sandbox Code Playgroud)