Automatycznie twórz wymagania.txt

277

Czasami pobieram kod źródłowy Pythona githubi nie wiem, jak zainstalować wszystkie zależności. Jeśli nie ma requirements.txtpliku, muszę go utworzyć ręcznie. Pytanie brzmi: Biorąc pod uwagę katalog kodu źródłowego Pythona, czy możliwe jest requirements.txtautomatyczne tworzenie z sekcji importu?

Igor Barinow
źródło
2
Możesz to zrobić, uruchamiając, pip freeze > requirements.txtaby zapisać wszystkie biblioteki Pythona z bieżącą wersją do requirements.txtpliku
Shaikhul
7
@Shaikhul, ale to nie pomaga w przypadku, gdy nie masz zainstalowanych zależności, ponieważ właśnie pobrałeś pakiet z GitHub ...
jonrsharpe
8
Uwaga: a) pip freezezrzuci bieżące wersje allzainstalowanych modułów w tym systemie, niezależnie od ich wykorzystania w bieżącym projekcie. b) pip wyświetli tylko moduły, które zostały zainstalowane przez pip
akskap
Możliwy duplikat Jak utworzyć plik wymagania.txt?
Daniel Santos,

Odpowiedzi:

290

Jeśli korzystasz ze środowiska wirtualnego, pip freeze > requirements.txtdobrze. JEŚLI NIE , pigar będzie dla ciebie dobrym wyborem.

Nawiasem mówiąc, nie zapewniam, że będzie działać z wersją 2.6.

AKTUALIZACJA :

Pipenv lub inne narzędzia są zalecane w celu usprawnienia rozwoju.

W przypadku Python 3 użyj poniżej

pip3 freeze > requirements.txt
nieważne
źródło
3
Dla każdego, kto popełnia błąd, zalecamy wypróbowanie pip3 freeze > requirements.txtprzed zadaniem pytania.
baranskistad
3
Wykonuję pip3 freeze > requirements.txti jestem zaskoczony, że nie znalazłem niektórych pakietów, których faktycznie używam, takich jak argparsei configparser. Czy to dlatego, że są częścią rdzenia Python? Uważam, że lepszym rozwiązaniem jest skorzystanie z pipreqsponiższej opcji, ponieważ będzie ona zawierała tylko wymagania, których używa twój projekt.
Alexis.Rolland
@ Alexis.Rolland Tak, argparsei configparsernależy do standardowej biblioteki Python3, więc co jest nie tak pip3 freeze? Nie rozumiem o co ci chodzi.
zawsze
11
@damnever Ok dziękuję! pip3 freezedaje mi listę wszystkich pakietów Pythona zainstalowanych w moim środowisku, podczas gdy pipreqsdaje mi wszystkie te, które faktycznie zostały użyte w moim kodzie źródłowym, którego właśnie szukałem. Poza tym nie ma w tym nic złego.
Alexis.Rolland
1
pipenv ma poważne problemy, zobacz tę dyskusję: news.ycombinator.com/item?id=18612590
Justin M. Keyes
364

Możesz użyć następującego kodu, aby wygenerować plik wymagania.txt:

pip install pipreqs

pipreqs /path/to/project

więcej informacji związanych z pipreqs można znaleźć tutaj .

Czasami można się natknąć pip freeze, ale zapisuje to wszystkie pakiety w środowisku, w tym te, których nie używasz w bieżącym projekcie.

DJanssens
źródło
1
@IgorBarinov to Ostrzeżenie i nie stworzy problemu do uruchomienia pipreqs, zainstalowałem go w Pythonie 2.6 i dostałem to samo ostrzeżenie, ale tworzy requirements.txtplik, dzięki @DJanssens
Shaikhul
1
@Shaikhul, jeśli dostaniesz te ostrzeżenia, nie będziesz mieć pełnego pliku, tylko dostaniesz część wymagań. Możesz to sprawdzić na repo github.com/npow/MemNN/tree/hyperopt . Mam tylko „hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0”
Igor Barinov
1
że powiedział it is strongly recommended to upgrade to a newer Python version
Shaikhul
2
Świetne narzędzie. Dzięki! Jego potężna funkcja polega na tym, że generuje dokładnie używane pakiety, a nie jak zamrożenie pipa!
Wesam Na
1
To nie działa w Pythonie 3.6, jeśli nowe formatowanie wyjściowe instrukcji drukowania jest używane.
Anand CU
12

W moim przypadku używam Anakondy, więc uruchomienie następującego polecenia z terminalu conda w moim środowisku rozwiązało go i automatycznie utworzyło dla mnie ten plik txt wymagań:

conda list -e > requirements.txt

To zostało zaczerpnięte z tego linku Github pratos / condaenv.txt

Jeśli wystąpił błąd i używasz anakondy, spróbuj użyć opcji .yml:

conda env export > <environment-name>.yml

Aby inna osoba mogła korzystać ze środowiska ... Lub jeśli tworzysz nowe środowisko na innym komputerze: conda env create -f .yml

Znaleziono opcję .yml tutaj

HassanSh__3571619
źródło
jeśli nie korzystasz ze środowiska wirtualnego, utworzy to zbyt długi plik wymagania.txt
SBFRF
1
Czy to naprawdę działa? Ilekroć próbowałem tego, istnieją zależności i szczegóły dotyczące składni, które pip install requirements.txtodrzucają.
conner.xyz 15.07.19
Znalazłem kilka błędów przy użyciu .txt, więc właśnie dodałem inną opcję, która również ze mną działała ... „Korzystanie z .yml” wspomniane powyżej.
HassanSh__3571619
5

Upewnij się, że uruchomiłeś pip3 dla Python3.7.

pip3 freeze >> yourfile.txt

Przed wykonaniem powyższego polecenia upewnij się, że stworzyłeś środowisko wirtualne.

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

Następnie umieść kod źródłowy w katalogu. Jeśli uruchomisz teraz plik python, prawdopodobnie nie uruchomi się, jeśli używasz modułów innych niż rodzime. Możesz zainstalować działające moduły

pip3 install <module> or pip install <module> 

Nie wpłynie to na całą listę modułów, z wyjątkiem środowiska, w którym się znajdujesz.

Teraz możesz wykonać polecenie u góry, a teraz masz plik wymagań, który zawiera tylko moduły zainstalowane w środowisku wirtualnym. Teraz możesz uruchomić polecenie u góry.

Radzę wszystkim, aby korzystali ze środowisk, ponieważ ułatwia to takie rzeczy.

Mam nadzieję, że to pomogło.

johnyjohnny
źródło
1

Jeśli napotykasz ten sam problem, co mój, tzn. Nie ma go w środowisku wirtualnym i chce wymagania.txt dla konkretnego projektu lub z wybranego folderu (obejmuje dzieci) i pipreqs nie jest obsługiwane.

Możesz użyć :

import os
import sys
from fuzzywuzzy import fuzz
import subprocess

path = "C:/Users/Username/Desktop/DjangoProjects/restAPItest"


files = os.listdir(path)
pyfiles = []
for root, dirs, files in os.walk(path):
      for file in files:
        if file.endswith('.py'):
              pyfiles.append(os.path.join(root, file))

stopWords = ['from', 'import',',','.']

importables = []

for file in pyfiles:
    with open(file) as f:
        content = f.readlines()

        for line in content:
            if "import" in line:
                for sw in stopWords:
                    line = ' '.join(line.split(sw))

                importables.append(line.strip().split(' ')[0])

importables = set(importables)

subprocess.call(f"pip freeze > {path}/requirements.txt", shell=True)

with open(path+'/requirements.txt') as req:
    modules = req.readlines()
    modules = {m.split('=')[0].lower() : m for m in modules}


notList = [''.join(i.split('_')) for i in sys.builtin_module_names]+['os']

new_requirements = []
for req_module in importables:
    try :
        new_requirements.append(modules[req_module])

    except KeyError:
        for k,v in modules.items():
            if len(req_module)>1 and req_module not in notList:
                if fuzz.partial_ratio(req_module,k) > 90:
                    new_requirements.append(modules[k])

new_requirements = [i for i in set(new_requirements)]

new_requirements

with open(path+'/requirements.txt','w') as req:
    req.write(''.join(new_requirements))

PS: Może mieć kilka dodatkowych bibliotek podczas sprawdzania fuzzylogic.

DARK_C0D3R
źródło
1

najlepszym sposobem na Python 3 jest:

pip3 freeze > requirements.txt

działało dla mnie ...

Mac Rathod
źródło
0

jeśli używasz PyCharm, po otwarciu lub sklonowaniu projektu do PyCharm wyświetli się alert i poprosi o zainstalowanie wszystkich niezbędnych pakietów.

Ahmet
źródło