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

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

10 ответов


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

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

Если вы хотите использовать 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.путь? для получения дополнительной информации.


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

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

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

import subprocess
import sys

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

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


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

import subprocess

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

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


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

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

вы можете установить с помощью sys module a well

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

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

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

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

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


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

import os

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

как

while True:

code = input("")

os.system("code")

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