在代码中安装python模块

时间:2012-09-08 17:33:03

标签: python pip python-module pypi

我需要在我的脚本中直接从PyPi安装一个包。 也许有一些模块或distutilsdistributepip等)功能允许我执行类似pypi.install('requests')的操作,并且请求将安装到我的virtualenv中。

19 个答案:

答案 0 :(得分:333)

您还可以使用以下内容:

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')

答案 1 :(得分:94)

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

昆腾的解决方案是解决问题的首选方法,但是他的实施并不能保证它会调用正确的点。

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

import subprocess
import sys

def install(package):
    subprocess.call([sys.executable, "-m", "pip", "install", package])

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

答案 2 :(得分:67)

如果您想使用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')

如果您以用户身份安装了软件包,则可能会遇到无法导入软件包的问题。有关其他信息,请参阅How to refresh sys.path?

答案 3 :(得分:17)

这应该有效:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])

答案 4 :(得分:7)

使用“install_requires”选项在自己包的setup.py中定义依赖模块。

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

答案 5 :(得分:3)

我希望这个问题仍然有效。 我做了以上这样的事情:

check3 = false

第二个try块也可以写在第一个try块的else部分,但是在我的问题语句中我必须写两个单独的块。

答案 6 :(得分:2)

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

import subprocess
import sys

try:
    import pandas as pd
except ImportError:
    subprocess.call([sys.executable, "-m", "pip", "install", 'pandas'])
finally:
    import pandas as pd

答案 7 :(得分:2)

要安装多个软件包,我正在使用带有以下代码的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])

答案 8 :(得分:1)

我假设我们的机器上有一个点子,并且会尝试捕捉一个缺少的特定依赖...试试这个方法让我知道你的想法。

import os
try: 
    import something
    .....
    .....
except ImportError as e:
    pip = lambda : os.system('pip install' + str(e)[15:])
    pip()

另外, 如果使用pip函数来应用&#34;自我意识&#34;请考虑使用lambda模块本身进口商机制。只需按照以下代码片段:))

try:
    import somthing
    ..........
    ..........
except ImportError as e:
    # importing pip module to handle pip functionalites
    import pip
    # create a lambda that import using pip by module_error_name=e[15:]
    installer = lambda : pip.main(['install', str(e)[15:])
    # create a lambda that import a module by linear_lambda_call
    importer = lambda x : __import__(str(x)).import_module()
    # install the module
    installer()
    # import the module
    importer()

答案 9 :(得分:1)

这就是我为项目安装所有软件包的方式。

只需将所有名称添加到列表中并执行,然后再运行主代码即可。

将其与“ venv”结合使用非常棒!

"""call this module to setup your python packages via pip"""

from pip._internal import main as pip

pip_install_argument = "install"

# packages to install
packages_to_install = [
        "numpy",        # math magic 1
        "scipy",        # math magic 2
        ]

def install(packages):
    """installes given packages via pip

    Args:
        package names as list

    Returns:
        None

    """
    global pip_install_argument
    for package in packages:
        pip([pip_install_argument, package])

if __name__ == '__main__':
    install(packages_to_install)

答案 10 :(得分:1)

对我来说,这可行(python 2.x),假设所有要求都在requirements.txt中定义:

def pip_auto_install():
    """
    Automatically installs all requirements if pip is installed.
    """
    try:
        from pip._internal import main as pip_main
        pip_main(['install', '-r', 'requirements.txt'])
    except ImportError:
        print("Failed to import pip. Please ensure that pip is installed.")
        print("For further instructions see "
              "https://pip.pypa.io/en/stable/installing/")
        sys.exit(-1)
    except Exception as err:
        print("Failed to install pip requirements: " + err.message)
        sys.exit(-1)


pip_auto_install()

答案 11 :(得分:1)

<块引用>

试试下面的。到目前为止对我有用的最好的 先安装 4 个,然后在 REQUIRED 列表中提及新的

import pkg_resources
import subprocess
import sys
import os

REQUIRED = {
  'spacy', 'scikit-learn', 'numpy', 'pandas', 'torch', 
  'pyfunctional', 'textblob', 'seaborn', 'matplotlib'
}

installed = {pkg.key for pkg in pkg_resources.working_set}
missing = REQUIRED - installed

if missing:
    python = sys.executable
    subprocess.check_call([python, '-m', 'pip', 'install', *missing], stdout=subprocess.DEVNULL)

答案 12 :(得分:0)

您可以使用sys模块安装

import sys
!{sys.executable} -m pip install <package> --user

答案 13 :(得分:0)

我使用os.system模拟导入模块的操作系统终端,因为这样,您可以在所有其他脚本中使用该模块。

例如,我正在创建一个游戏引擎,它运行在一起添加的单独脚本上,大多数脚本都使用Pygame,如果用户没有pygame,启动文件将使用以下代码添加它:

import os
os.system('pip install pygame')

不幸的是,我不知道如何将pip放到用户的机器上,因此这取决于用户的pip。

答案 14 :(得分:0)

由于可导入的pip模块并非始终有效,因此存在更可靠的方法:

def PackageInstall(error):
    '''
    Finds out which package is missing and downloads it automatically after five seconds.

    Use example:

    try:
        import numpy as np
        import matplotlib.pyplot as plot

    except ImportError as error:
        PackageInstall(error)

    '''
    import time, subprocess, os, sys
    lib = str(error)[15:].replace('\'', '')
    print('>>>',str(error))
    print('>>> Download will start after five seconds')
    time.sleep(5)
    subprocess.call("pip install " + lib)

    print('>>> Restarting')
    os.startfile(__file__)
    sys.exit()

这适用于Windows。

答案 15 :(得分:0)

第一

> Download
> https://github.com/GeoNode/geonode-win-installer/blob/master/python_deps/pip-9.0.1-py2.py3-none-any.whl

第二

extract .whl file and;  use winRar
copy extracted file and paste sitepackage [or python module container]

files are.. pip and pip-19.0.3.dist-info

第三

import pip
pip.main(['install','scpy'])

scpy or any package you want to install

答案 16 :(得分:0)

import os
os.system('pip install requests')

我在上面尝试了临时解决方案,而不是更改docker文件。希望这些对某些人有用

答案 17 :(得分:0)

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

这适用于不同的 requirment specifiers,这很好。例如>===

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)

示例用法:

requirement_list = ['requests', 'httpx==0.18.2']
install_packages(requirement_list)

demo

相关信息Stackoverflow Question: 58612272

答案 18 :(得分:-10)

你总是可以下载

test

然后右键所有终端命令从那里下载。

import os
无论是什么,我都不确定,但如果你甚至不知道如何在终端中做到这一点你将如何在python中做到这一点。