2012-09-08 18 views
143

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

+1

Dlaczego nie definiujesz powiązanego modułu jako zależności w pliku setup.py swojego pakietu? –

+3

wiesz ... sposób, w jaki faktycznie powinno to być zrobione ... ale zawsze możesz os.system ("pip install blah"), ale możesz potrzebować dostępu sudo ... lepiej po prostu uczynić z niego zależność w konfiguracji .py –

+0

To samo pytanie, ale o łatwej instalacji (2.7 nie jest wysyłane z pip) –

Odpowiedz

253

Można również użyć coś takiego:

import pip 

def install(package): 
    pip.main(['install', package]) 

# Example 
if __name__ == '__main__': 
    install('argh') 
+8

Myślę, że pip.main() jest najbardziej poprawną odpowiedzią. Nie rozumiem, dlaczego nie znalazłem go, gdy zadano mi to pytanie. Dziękujemy i zapraszamy do SO. – chuwy

+0

Tutaj kończy się po zainstalowaniu. – fiatjaf

+0

@Rikard Anglerud. Czy istnieje możliwość uaktualnienia pakietów w pakiecie? coś w rodzaju ''install --upgrade''? – jason

7

Użytkownik definiuje moduł zależny wewnątrz pliku setup.py swojego pakietu za pomocą opcji "install_requires".

Jeśli pakiet wymaga wygenerowania skryptu konsoli, można użyć punktu wejścia "console_scripts" w celu wygenerowania skryptu opakowującego, który zostanie umieszczony w folderze "bin" (np. Twojego środowiska virtualenv).

+0

To jest poprawna odpowiedź i jedyny rozsądny sposób zarządzania zależnościami projektów Pythona. Będzie działać z virtualenv, Fabric, buildout, ty to nazwij. Metoda opisana przez @xiaomao, mimo że odpowiada dokładnie na to, co zadawał OP, jest czystym szaleństwem. –

+2

podczas gdy jest to właściwa rada, nie odpowiada na zadane pytanie –

+0

Podczas gdy pakowanie jest tematem, istnieje wiele innych przypadków użycia, na przykład skrypt wdrożeniowy napisany w pythonie. – hoefling

7

To powinno działać:

import subprocess 

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

Tak, zdecydowanie powinno działać. Ale myślałem, że jest bardziej elegancki sposób;) Będę czekał trochę, może być. – chuwy

+1

@Dvvvoter: Co dokładnie jest nie tak z moją odpowiedzią? Ta odpowiedź ma wszystko, czego chciał OP. Nie używa nawet powłoki. – quantum

+6

To zależy od tego, czy właściwa wersja pip jest pierwsza na ścieżce. Jeśli użytkownik uruchamia alternatywną instalację Pythona, PIP zostanie zainstalowany na pierwszym, a nie na bieżącym. Powyższe podejście do importowania zostanie zainstalowane we właściwym miejscu. Mimo to przegłosowałem, aby przeciwdziałać głosowaniu w dół. – GaryBishop

52

Jeśli chcesz użyć pip zainstalować wymagany pakiet i zaimportować go po instalacji, można 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 nie możesz po prostu zaimportować paczki. Aby uzyskać dodatkowe informacje, patrz How to refresh sys.path?.

+3

Każdy pomysł jak to zrobić w Pythonie 3? Imp.reload (witryna) 'dostaje mnie' RuntimeError: słownik zmienił rozmiar podczas iteracja' – kgadek

+0

gdzie to instaluje pakiet, po tym jak to zrobiłem, nie byłem w stanie zrobić 'pip uninstall ' .Czy nadal mogę go odinstalować za pomocą 'pip.main' ale chciałbym tylko wiedzieć, gdzie on instaluje pakiet? –

+0

Byłby ciekawy, czy to działałoby poprawnie, jeśli to zrobię: 'żądania instalacji potoku [zabezpieczenia]'? Nie byłem pewien, czy poprawnie zdefiniowałoby to globale poprawnie – Fallenreaper

-3

zawsze można pobrać

import os 

następnie w prawo nakazuje wszystkim terminal ściągnąć go stamtąd.

jak

while True: 

code = input("") 

os.system("code") 

cokolwiek to jest, nie jestem pewien, ale jeśli nawet nie wiem jak to zrobić w terminalu jak masz zamiar to zrobić w Pythonie.

2

Mam nadzieję, że to pytanie jest nadal aktualne. zrobiłem powyższy 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ć napisany w ramach innego pierwszego bloku try, jak również, ale w moim oświadczeniu Problem musi napisać dwa oddzielne bloki.

+0

os.system is depr ecated ... użyj modułu podprocesu –

0

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

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

można zainstalować za pomocą modułu sys dobrze

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

używam os.system emulować terminal os importowanie modułu bo wtedy można użyć modułu we wszystkich innych skryptów.

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

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

Niestety, nie mam pojęcia, jak pobrać pip na komputerze użytkownika, więc jest to zależne od użytkownika posiadającego pip.

Powiązane problemy