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
Odpowiedz
Można również użyć coś takiego:
import pip
def install(package):
pip.main(['install', package])
# Example
if __name__ == '__main__':
install('argh')
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
Tutaj kończy się po zainstalowaniu. – fiatjaf
@Rikard Anglerud. Czy istnieje możliwość uaktualnienia pakietów w pakiecie? coś w rodzaju ''install --upgrade''? – jason
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).
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. –
podczas gdy jest to właściwa rada, nie odpowiada na zadane pytanie –
Podczas gdy pakowanie jest tematem, istnieje wiele innych przypadków użycia, na przykład skrypt wdrożeniowy napisany w pythonie. – hoefling
To powinno działać:
import subprocess
def install(name):
subprocess.call(['pip', 'install', name])
Tak, zdecydowanie powinno działać. Ale myślałem, że jest bardziej elegancki sposób;) Będę czekał trochę, może być. – chuwy
@Dvvvoter: Co dokładnie jest nie tak z moją odpowiedzią? Ta odpowiedź ma wszystko, czego chciał OP. Nie używa nawet powłoki. – quantum
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
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?.
Każdy pomysł jak to zrobić w Pythonie 3? Imp.reload (witryna) 'dostaje mnie' RuntimeError: słownik zmienił rozmiar podczas iteracja' – kgadek
gdzie to instaluje pakiet, po tym jak to zrobiłem, nie byłem w stanie zrobić 'pip uninstall
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
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.
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.
os.system is depr ecated ... użyj modułu podprocesu –
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()
można zainstalować za pomocą modułu sys dobrze
import sys
!{sys.executable} -m pip install <package> --user
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.
Dlaczego nie definiujesz powiązanego modułu jako zależności w pliku setup.py swojego pakietu? –
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 –
To samo pytanie, ale o łatwej instalacji (2.7 nie jest wysyłane z pip) –