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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

import subprocess

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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

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

Ответ 8

Я думаю, что это может быть проще, используя os.system

from os import system

package = # the name of the package
system('pip install %s' % package)

Ответ 9

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

Ответ 10

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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

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

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

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

Ответ 14

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

первый

> 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

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

import os

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

как

while True:

code = input("")

os.system("code")

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