Instalacja modułu Pythona w kodzie

Muszę zainstalować pakiet z PyPi prosto w moim skrypcie. Może jest jakiś moduł lub distutils (distribute, pip itd.) funkcja, która pozwala mi po prostu wykonać coś w rodzaju pypi.install('requests') i żądania zostaną zainstalowane w moim virtualenv.

Author: chuwy, 2012-09-08

10 answers

Możesz również użyć czegoś w rodzaju:

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')
 297
Author: Rikard Anglerud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-17 11:37:29

Jeśli chcesz użyć pip do zainstalowania wymaganego pakietu i zaimportowania go po instalacji, możesz użyć tego kodu:

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

Jeśli zainstalowałeś pakiet jako użytkownik, możesz napotkać problem, że nie możesz go po prostu zaimportować. Zobacz Jak odświeżyć sys./ align = "left" / aby uzyskać dodatkowe informacje.

 60
Author: rominf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:30

Rozwiązanie Rickarda nie jest obsługiwane przez zespół programistów pip i w niektórych przypadkach ulegnie awarii (np. wielowątkowy). Ponadto od pip 10 kod został przeniesiony do pip._internal w celu wyjaśnienia, że nie jest to obsługiwane, rozwiązanie to zawiedzie z błędem importu na "pip>=10.0.0".

Rozwiązanie Quantum jest preferowanym sposobem rozwiązania problemu, jednak jego implementacja nie gwarantuje, że wywoła poprawny pip.

To rozwiązanie gwarantuje, że wywołuje pip interpretera Pythona obsługującego kod.

import subprocess
import sys

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

Robi to samo co rozwiązanie Quantum, jednak zamiast uruchamiać pip bezpośrednio, uruchamia ten sam program wykonywalny Pythona, uruchamiając kod i nakazując mu wykonanie zainstalowanego modułu pip i przekazując mu resztę argumentów.

 32
Author: Aaron de Windt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-09 13:47:15

To powinno zadziałać:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])
 12
Author: quantum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 17:52:29

Definiujesz moduł zależny wewnątrz setup.py własnego pakietu z opcją "install_requires".

Jeśli twój pakiet musi mieć wygenerowany skrypt konsoli, możesz użyć punktu wejścia" console_scripts", aby wygenerować skrypt wrappera, który zostanie umieszczony w folderze 'bin' (np. Twojego środowiska virtualenv).

 7
Author: Andreas Jung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-08 17:38:59

Mam nadzieję, że to pytanie jest nadal aktualne. Zrobiłem powyższe coś takiego:

    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)

Drugi blok try może być również zapisany w części else pierwszego bloku try, jednak w moim problem statement muszę napisać dwa oddzielne bloki.

 3
Author: Umesh Kaushik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-12 11:38:38

Zakładam, że mamy pip na naszej maszynie i spróbujemy złapać konkretną zależność, której brakuje.. spróbuj tej metody i daj mi znać, co myślisz.

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

Także, proszę rozważyć pracę z samym Modułem pip, jeśli używa się funkcji lambda do zastosowania "samoświadomego" mechanizmu importera. Po prostu podążając za tym fragmentem kodu:)

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
Author: SysMurff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 19:17:55

Możesz zainstalować za pomocą modułu sys a well

import sys
!{sys.executable} -m pip install <package> --user
 0
Author: Tom J Muthirenthi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-07 17:01:10

Używam os.system do emulowania terminala os importującego moduł, ponieważ wtedy można go używać we wszystkich innych skryptach.

Na przykład, tworzę silnik gry, który działa na oddzielnych skryptach dodanych razem, większość z tych skryptów używa Pygame i jeśli użytkownik nie ma pygame, plik startowy doda go za pomocą tego kodu:

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

Niestety, nie mam pojęcia, jak dostać Pipa na maszynę użytkownika, więc zależy to od tego, czy użytkownik ma Pipa.

 0
Author: X0FloH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 10:52:03

Zawsze możesz pobrać

import os

Następnie wszystkie polecenia terminala, aby pobrać go stamtąd.

Jak

while True:

code = input("")

os.system("code")

Cokolwiek to jest, nie jestem pewien, ale jeśli nawet nie wiesz, jak to zrobić w terminalu, jak to zrobisz w Pythonie.

 -10
Author: techset,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-01 21:32:09