18

假设您已经在 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()因为这可能会产生其他问题。

我认为这是可能的...

4

3 回答 3

25

更新了较新的 pip 版本 (>= 10.0):

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

感谢@Joop,我能够想出正确的答案。

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

一个重要的说明是,这无需 root 访问即可工作,因为它将模块安装在用户目录中。

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

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

于 2013-06-24T09:51:55.687 回答
11

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

try: import abc
except ImportError:
    from pip._internal import main as pip
    pip(['install', '--user', 'abc'])
    import abc
于 2018-07-26T06:12:36.657 回答
3

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

更好的方法是:

import pip

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

if 'package' not in packages:
    pip.main(['install', 'package'])
于 2016-08-26T18:42:20.850 回答