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


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

10 176

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

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

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

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 колодец

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.