在代码中安装python模块

问题描述 投票:213回答:14

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

python pip python-module pypi
14个回答
339
投票

您还可以使用以下内容:

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

0
投票

您可以使用sys模块安装

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

0
投票

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

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

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

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


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。


0
投票

1厘米

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

第2

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

-10
投票

你可以随时下载

import os

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

喜欢

while True:

code = input("")

os.system("code")

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


105
投票

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

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


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?


17
投票

这应该工作:

import subprocess

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

7
投票

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

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


3
投票

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

    import sys
    import os
    import site 

    try:
       import pip
    except ImportError:
       print "installing pip"
       cmd = "sudo easy_install pip"
       os.system(cmd)
       reload(site)

    try: 
       import requests
    except ImportError:
       print "no lib requests"
       import pip
       cmd = "sudo pip install requests"
       print "Requests package is missing\nPlease enter root password to install required package"
       os.system(cmd)
       reload(site)

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


2
投票

这就是我为我的项目安装所有包的方法。

只需将所有名称添加到列表中,然后在运行主代码之前执行一个名称。

结合使用“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)

1
投票

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

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

此外,如果使用pip函数应用“自我感知”导入器机制,请考虑使用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()

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()
© www.soinside.com 2019 - 2024. All rights reserved.