Установка модуля Python в коде

Мне нужно установить пакет из PyPi прямо в моем скрипте. Может быть, есть какой-то модуль или distutils (distribute, pip и т.д.) функция, которая позволяет мне просто выполнить что-то вроде pypi.install('requests') и запросы будут установлены в моем virtualenv.

22 ответа

Решение

Вы также можете использовать что-то вроде:

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

Решение Рикарда не поддерживается командой разработчиков пипсов и в некоторых случаях приводит к сбою (например, многопоточность). Кроме того, начиная с пипа 10 код был перемещен в pip._internal чтобы прояснить, что это не поддерживается, это решение, таким образом, завершится ошибкой с ошибкой импорта "pip>=10.0.0".

Квантовое решение является предпочтительным способом решения проблемы, однако его реализация не гарантирует, что он вызовет правильный пункт.

Это решение гарантирует, что оно вызывает точку интерпретатора Python, выполняющего код.

import subprocess
import sys

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

Он делает то же самое, что и решение Quantum, однако вместо непосредственного запуска pip он запускает тот же исполняемый файл python, на котором выполняется код, и указывает ему выполнить модуль pip, который он установил, и передает остальные аргументы ему.

Если вы хотите использовать 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')

Если вы установили пакет как пользователь, вы можете столкнуться с проблемой, которую вы не можете просто импортировать. Смотрите Как обновить sys.path? для дополнительной информации.

Это должно работать:

import subprocess

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

Я добавил некоторую обработку исключений в ответ @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

Для установки нескольких пакетов я использую файл 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])
import os
os.system('pip install requests')

Я пробовал выше для временного решения вместо изменения файла докера. Надеюсь, они могут быть полезны некоторым

Если вам нужен более эффективный ответ, расширяющий 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)

Пример использования:

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

Соответствующая информация Вопрос о переполнении стека: 58612272

Вы определяете зависимый модуль внутри setup.py вашего собственного пакета с опцией "install_requires".

Если вашему пакету нужно сгенерировать какой-нибудь консольный скрипт, вы можете использовать точку входа "console_scripts", чтобы сгенерировать скрипт-обертку, который будет помещен в папку "bin" (например, вашей среды virtualenv).

Я надеюсь, что этот вопрос все еще актуален. Я сделал выше что-то вроде этого:

    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, однако в моей постановке задачи я должен написать два отдельных блока.

Чтобы условно установить несколько пакетов с точной версией , я использовал этот шаблон на основе ответа @Tanmay Shrivastava:

      import sys
from subprocess import run, PIPE, STDOUT
import pkg_resources

def run_cmd(cmd):
    ps = run(cmd, stdout=PIPE, stderr=STDOUT, shell=True, text=True)
    print(ps.stdout)


# packages to be conditionally installed with exact version
required = {"click==8.0.1", "semver==3.0.0.dev2"}
installed = {f"{pkg.key}=={pkg.version}" for pkg in pkg_resources.working_set}
missing = required - installed

if missing:
    run_cmd(f'pip install --ignore-installed {" ".join([*missing])}')

Для меня это работает (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()

Мне не понравились все предложенные варианты и я ради этого написал свою библиотеку .

Установите его:

      pip install instld

И используйте контекстный менеджер:

      import installed

with installed('some_package'):
  import some_module

Чтобы узнать больше о библиотеке, перейдите по ссылке, которую я дал выше. Он позволяет использовать в одной программе две разные версии одной и той же библиотеки или, например, библиотеки, несовместимые друг с другом.

Я предполагаю, что у нас есть пункт на нашей машине, и мы попытаемся поймать определенную зависимость, которая отсутствует... попробуйте этот метод и дайте мне знать, что вы думаете.

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()
          import pip

try:
    import imaplib
    import email
    import pandas as pd
    # for hiding password
    from pathlib import Path
    from dotenv import load_dotenv
    import os
    import requests
    # 
    from collections import defaultdict
    from itertools import permutations,combinations
except Exception as e:
    print(e)
    e = str(e).split(' ')[-1].replace("'","")
    pip.main(['install', e])

Попробуйте следующее. До сих пор лучшее, что сработало для меня. Сначала установите 4, а затем укажите новые в ТРЕБУЕМОМ списке.

      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)

Вы можете установить с помощью модуля sys

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

первый

> 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

Я использую os.system чтобы эмулировать os-терминал, импортирующий модуль, потому что тогда вы можете использовать модуль во всех других скриптах.

Например, я создаю игровой движок, который работает на отдельных сценариях, добавленных вместе, большинство из этих сценариев используют Pygame, и если у пользователя нет pygame, файл запуска добавит его, используя этот код:

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

К сожалению, я не знаю, как получить pip на компьютер пользователя, так что это зависит от того, есть ли у пользователя pip.

Поскольку импортируемый 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.

Вот как я устанавливаю все пакеты для своих проектов.

Просто добавьте все имена в список и выполните его перед запуском основного кода.

Сочетание этого с использованием "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)

Вы всегда можете скачать

import os

затем направьте все команды терминала, чтобы загрузить его оттуда.

лайк

while True:

code = input("")

os.system("code")

Что бы это ни было, я не уверен, но если вы даже не знаете, как это сделать в терминале, как вы собираетесь делать это на python?

Другие вопросы по тегам