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

时间:2013-06-24 08:50:22

标签: 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

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

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

3 个答案:

答案 0 :(得分:17)

感谢@Joop,我能够得到正确的答案。

try:
    import zumba
except ImportError:
    import pip
    pip.main(['install', '--user', 'zumba'])
    import zumba

一个重要的评论是,这将在不需要root访问权限的情况下工作,因为它会将模块安装在用户目录中。

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

现在您可以编写自包含脚本而不用担心依赖项。

答案 1 :(得分:7)

从pip版本> = 10.0.0开始,由于内部软件包的重组,上述解决方案将不起作用。现在,在脚本中使用pip的新方法如下:

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

答案 2 :(得分:3)

我想要注意的是,当前接受的答案可能会导致应用程序名称冲突。从应用程序命名空间导入并不能全面了解系统上安装的内容。

更好的方法是:

import pip

packages = [package.project_name for package in pip.get_installed_distributions()]

if 'package' not in packages:
    pip.main(['install', 'package'])