如何从需要的脚本内部安装缺少的python包?

如何从需要的脚本内部安装缺少的python包?,python,pip,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或easy_install,我想知道如何在脚本本身的用户目录中安装所需的包

据我所知,pip也是一个python模块,因此解决方案应该如下所示:

try:
    import zumba
except ImportError:
    import pip
    # ... do "pip install --user zumba" or throw exception   <-- how?
    import zumba
试试看:
进口尊巴
除恐怖外:
进口pip

# ... 执行“pip安装--用户zumba”或抛出异常更新pip版本(>=10.0):

多亏了@Joop,我才想出了正确的答案

try:
    import zumba
except ImportError:
    import pip
    pip.main(['install', '--user', 'zumba'])
    import zumba
一个重要的注意事项是,这将在不需要root访问的情况下工作,因为它将在用户目录中安装模块

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


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

我想指出,当前接受的答案可能会导致应用程序名称冲突。从应用程序名称空间导入不会提供系统上安装内容的完整信息

更好的办法是:

import pip

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

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

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

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

这个解决方案怎么样:我认为在安装脚本之外,这将是一个非常不受欢迎的编码实践。我(我猜大多数人)不喜欢/不信任我运行的任何改变环境的程序。像pip和virtualenv这样的工具专门存在,这样“用户”就可以控制安装到哪个版本的软件包。我不是distutils方面的专家,但我知道它可以列出任何包的先决条件。如果它只是供你自己使用,你可能会咀嚼一些代码。谢谢你们,它工作得很好。值得注意的是,对于独立脚本,而不是模块/包,这是一个很好的解决方案。似乎pip.main()只是命令行工具的包装器,而不是提供API。有点难看,但我想是实用的。我收到一条“拒绝访问”的消息,直到我添加了
--user
。我已经为较新的pip版本更新了这个答案。希望它没问题,因为它不会改变答案的精神,只是改变方法的位置。对于pip>10,请使用
pip.\u internal.utils.misc.get\u installed\u distributions
try: import abc
except ImportError:
    from pip._internal import main as pip
    pip(['install', '--user', 'abc'])
    import abc