在代码中安装python模块

chu*_*uwy 249 python pip python-module pypi

我需要在我的脚本中直接从PyPi安装一个包.也许有一些模块或distutils(distribute,pip等)功能,它允许我只是执行像pypi.install('requests')和请求将被安装到我的virtualenv.

小智 362

您还可以使用以下内容:

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __name__ == '__main__':
    install('argh')
Run Code Online (Sandbox Code Playgroud)

  • `从pip._internal import main作为pipmain`然后你可以使用`pipmain()`就像不推荐使用的`pip.main()`参见/sf/ask/3037927301/ -attribute,主 (23认同)
  • 由于某种原因,它已被弃用并且不再推荐。请参阅 https://pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program (11认同)
  • 它现在已经堕落了. (10认同)
  • 我认为,pip.main()是最正确的答案.不明白,为什么我在问这个问题时没找到它.谢谢,欢迎来到SO. (9认同)
  • @nbro你可以像在命令行一样将选项传递给`pip.main()`(但是每个选项都作为列表中的单独条目,而不是单个字符串).并指定所需的软件包版本,与命令行中的相同.ex:`pip.main(['install','pip == 7.1.0'])` (3认同)
  • 另请参阅http://stackoverflow.com/questions/6457794/pip-install-r-continue-past-installs-that-fail,其中显示了如何处理安装失败的情况. (3认同)
  • python 官方文档明确建议不要这样做。为什么这会被投票? (3认同)
  • 如果您没有配备PowerShell的计算机,这也是通过Python控制台在Windows上安装新python库的绝佳选择. (2认同)
  • 无法正常工作,并给我错误:追溯(最近一次拨打电话):文件“ /home/***/git/pip.py”,第9行,在<module> install('arg')文件“ / home / *** / git / pip.py“,第4行,在安装pip.main(['install',package])中AttributeError:'module'对象没有属性'main' (2认同)
  • 不起作用,请更新。https://pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program (2认同)

Aar*_*ndt 149

pip开发团队不支持Rickard的解决方案,并且在某些情况下会崩溃(例如多线程).此外,由于pip 10代码已被移动pip._internal以便明确表示不支持,因此该解决方案将因"pip> = 10.0.0"导入错误而失败.

Quantum的解决方案是解决问题的首选方法,但是他的实现并不能保证它会调用正确的点.

这个解决方案保证它调用运行代码的python解释器的pip.

import subprocess
import sys

def install(package):
    subprocess.call([sys.executable, "-m", "pip", "install", package])
Run Code Online (Sandbox Code Playgroud)

它与Quantum的解决方案相同,但它不是直接运行pip,而是运行运行代码的相同python可执行文件,并告诉它执行它已安装的pip模块并将其余参数传递给它.

  • 请注意,从 3.5 开始,现在建议使用 [subprocess.run(..., check=True)](https://docs.python.org/3/library/subprocess.html#subprocess.check_call) (11认同)
  • CalledProcessError:命令'['C:\\ ProgramData \\ Anaconda3 \\ pythonw.exe','-m','pip','install','googleapiclient']'返回非零退出状态1。 (8认同)
  • 这是现在有效的.代码已经改变. (3认同)
  • 这样做的一个问题是,对于 Windows 上的新手用户来说,python 和 pip 并不总是在他们的 PATH 上,因此可以双击的 .py 文件会非常方便,而“pip install xxx”注释可以相当棘手。 (2认同)
  • 我正在尝试使用这种方法,但是我的 python 是从另一个可执行文件嵌入/启动的,因此“sys.executable”不会返回正确的路径。有没有一种替代方案适用于由其他进程启动的 python? (2认同)

rom*_*inf 70

如果要用于pip安装所需的软件包并在安装后导入它,则可以使用以下代码:

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')
Run Code Online (Sandbox Code Playgroud)

如果您以用户身份安装了软件包,则可能会遇到无法导入软件包的问题.请参见如何刷新sys.path?了解更多信息.

  • 过时了。`pip.main` 不再有效。https://pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program (5认同)
  • 知道如何在Python 3上做到这一点吗?`imp.reload(site)`得到我`RuntimeError:字典在迭代期间改变了大小` (4认同)

Soh*_*Das 23

我在@Aaron 的回答中添加了一些异常处理。

import subprocess
import sys

try:
    import pandas as pd
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", 'pandas'])
finally:
    import pandas as pd
Run Code Online (Sandbox Code Playgroud)

  • 您没有检查“subprocess.call”的返回值,因此代码可能会失败。 (4认同)
  • subprocess 和 pip 的良好实现,比这里的大多数解决方案都要好 (2认同)

qua*_*tum 22

这应该工作:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])
Run Code Online (Sandbox Code Playgroud)

  • 这取决于pip在路径上的正确版本.如果用户正在运行备用python安装,则pip将安装到第一个而不是当前安装.上面的导入方法将安装在正确的位置.无论如何,我还是反对投票. (9认同)
  • 调用 `[sys.executable, '-m', 'pip', 'install', name]` 确保在这里获得“正确的”pip。 (6认同)
  • @Downvoter:我的回答到底有什么问题?这个答案已经满足了OP想要的所有内容。它甚至不使用外壳。 (3认同)
  • 是的,它绝对应该有效。但我认为有更优雅的方式;)我会稍等一下,也许有。 (2认同)
  • 根据脚本的运行方式,您不会调用正确的点。 (2认同)

Jan*_*amu 13

使用:

import os
os.system('pip install requests')
Run Code Online (Sandbox Code Playgroud)

我尝试了上述临时解决方案,而不是更改Docker 文件


小智 8

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

如果你的包需要生成一些控制台脚本,那么你可以使用"console_scripts"入口点来生成一个包装器脚本,该脚本放在'bin'文件夹中(例如你的virtualenv环境).

  • 虽然这是适当的建议,但它没有回答问题 (5认同)
  • 虽然打包是一个主题,但还有很多其他用例,例如用 Python 编写的部署脚本。 (4认同)

Gle*_*son 8

如果您想要一个扩展的更有效的答案subprocess.check_call。您可以首先使用 检查是否已满足要求pkg_resources

这适用于不同的需求说明符,这很好。例如>=,,,==

import sys
import subprocess
import pkg_resources
from pkg_resources import DistributionNotFound, VersionConflict

def should_install_requirement(requirement):
    should_install = False
    try:
        pkg_resources.require(requirement)
    except (DistributionNotFound, VersionConflict):
        should_install = True
    return should_install


def install_packages(requirement_list):
    try:
        requirements = [
            requirement
            for requirement in requirement_list
            if should_install_requirement(requirement)
        ]
        if len(requirements) > 0:
            subprocess.check_call([sys.executable, "-m", "pip", "install", *requirements])
        else:
            print("Requirements already satisfied.")

    except Exception as e:
        print(e)
Run Code Online (Sandbox Code Playgroud)

用法示例:

requirement_list = ['requests', 'httpx==0.18.2']
install_packages(requirement_list)
Run Code Online (Sandbox Code Playgroud)

演示

相关信息:Stack Overflow问题:58612272


小智 7

为了安装多个软件包,我使用了一个带有以下代码的 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])
Run Code Online (Sandbox Code Playgroud)

  • `*missing` 前面的星号用于解压由变量名 `missing` 表示的集合。另请参阅:[_理解Python的星号(*)_](https://medium.com/understand-the-python/understand-the-asterisk-of-python-8b9daaa4a558) (2认同)