Anforderungen.txt automatisch erstellen


276

Manchmal lade ich den Python-Quellcode von herunter githubund weiß nicht, wie ich alle Abhängigkeiten installieren soll. Wenn es keine requirements.txtDatei gibt, muss ich sie von Hand erstellen. Die Frage ist: Ist es angesichts des Python-Quellcodeverzeichnisses möglich, requirements.txtautomatisch aus dem Importabschnitt zu erstellen ?


2
Sie können dies tun, indem Sie pip freeze > requirements.txtalle Ihre Python-Bibliotheken mit der aktuellen Version in einer requirements.txtDatei speichern
Shaikhul

7
@Shaikhul, aber das hilft nicht, wenn Sie die Abhängigkeiten nicht installiert haben, weil Sie gerade das Paket von GitHub heruntergeladen haben ...
jonrsharpe

8
Bitte beachten Sie: a) pip freezespeichert aktuelle Versionen der allauf diesem System installierten Module unabhängig von ihrer Verwendung im aktuellen Projekt. b) pip listet nur Module auf, die über pip
akskap

Antworten:


289

Wenn Sie eine virtuelle Umgebung verwenden, ist das in pip freeze > requirements.txtOrdnung. Wenn nicht , ist Zigarre eine gute Wahl für Sie.

Ich kann übrigens nicht sicherstellen, dass es mit 2.6 funktioniert.

UPDATE :

Pipenv oder andere Tools werden empfohlen, um Ihren Entwicklungsfluss zu verbessern.

Für Python 3 verwenden Sie unten

pip3 freeze > requirements.txt

3
Für alle, die Fehler machen, empfehle ich, es zu versuchen, pip3 freeze > requirements.txtbevor sie eine Frage stellen.
Baranskistad

3
Ich führe aus pip3 freeze > requirements.txtund bin überrascht, einige Pakete, die ich tatsächlich verwende, wie argparseund , nicht zu finden configparser. Liegt es daran, dass sie Teil des Python-Kerns sind? Ich glaube, eine bessere Antwort ist die Verwendung pipreqsunten, da nur die Anforderungen aufgeführt werden, die Ihr Projekt verwendet.
Alexis.Rolland

@ Alexis.Rolland Ja, argparseund configparsergehört zur Python3-Standardbibliothek. Also, was ist los mit pip3 freeze? Ich verstehe deinen Standpunkt nicht.
Damnever

11
@damnever Ok danke! pip3 freezegibt mir die Liste aller in meiner Umgebung installierten Python-Pakete, während pipreqsich alle tatsächlich in meinem Quellcode verwendeten Pakete bekomme, nach denen ich gesucht habe. Abgesehen davon ist nichts falsch daran.
Alexis.Rolland

1
pipenv hat schwerwiegende Probleme, siehe diese Diskussion: news.ycombinator.com/item?id=18612590
Justin M. Keyes

360

Mit dem folgenden Code können Sie eine Datei "require.txt" generieren:

pip install pipreqs

pipreqs /path/to/project

Weitere Informationen zu pipreqs finden Sie hier .

Manchmal stoßen Sie auf etwas pip freeze, aber dies speichert alle Pakete in der Umgebung, einschließlich derer, die Sie in Ihrem aktuellen Projekt nicht verwenden.


1
@IgorBarinov das ist eine Warnung und wird kein Problem zum Ausführen verursachen pipreqs. Ich habe es auf Python 2.6 installiert und die gleiche Warnung erhalten, aber es erstellt eine requirements.txtDatei, danke @DJanssens
Shaikhul

1
@Shaikhul Wenn Sie diese Warnungen erhalten haben, haben Sie keine vollständige Datei, sondern nur einen Teil der Anforderungen. Sie können es auf github.com/npow/MemNN/tree/hyperopt repo überprüfen . Ich habe nur 'hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0'
Igor

1
das heißt it is strongly recommended to upgrade to a newer Python version
Shaikhul

2
Tolles Werkzeug. Vielen Dank! Das mächtige Merkmal davon, dass es genau die verwendeten Pakete generiert, nicht wie Pip Freeze!
Wesam Na

1
Dies funktioniert nicht für Python 3.6, wenn die neue Formatierung der Druckanweisungsausgabe uesd ist.
Anand CU

10

In meinem Fall verwende ich Anaconda. Durch Ausführen des folgenden Befehls vom Conda-Terminal in meiner Umgebung wurde dies behoben und diese txt-Anforderungsdatei automatisch für mich erstellt:

conda list -e > requirements.txt

Dies wurde von diesem Github-Link pratos / condaenv.txt übernommen

Wenn ein Fehler aufgetreten ist und Sie Anaconda verwenden, versuchen Sie, die Option .yml zu verwenden:

conda env export > <environment-name>.yml

Damit eine andere Person die Umgebung nutzen kann ... Oder wenn Sie eine neue Umgebung auf einem anderen Computer erstellen: conda env create -f .yml

.yml Option wurde hier gefunden


Wenn Sie keine virtuelle Umgebung verwenden, wird eine zu lange Datei "
require.txt"

1
Funktioniert das tatsächlich? Wann immer ich dies versucht habe, gibt es Abhängigkeiten und Syntaxangaben, die pip install requirements.txtabgelehnt werden.
conner.xyz

Ich habe einige Fehler bei der Verwendung der .txt gefunden, also habe ich einfach die andere Option hinzugefügt, die auch bei mir funktioniert hat ... "Verwenden der .yml" oben erwähnt.
HassanSh__3571619

5

Stellen Sie sicher, dass pip3 für python3.7 ausgeführt wird.

pip3 freeze >> yourfile.txt

Stellen Sie vor dem Ausführen des obigen Befehls sicher, dass Sie eine virtuelle Umgebung erstellt haben.

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

Danach legen Sie Ihren Quellcode in das Verzeichnis. Wenn Sie die Python-Datei jetzt ausführen, wird sie wahrscheinlich nicht gestartet, wenn Sie nicht native Module verwenden. Sie können die laufenden Module installieren

pip3 install <module> or pip install <module> 

Dies wirkt sich nicht auf Ihre gesamte Modulliste aus, außer auf die Umgebung, in der Sie sich befinden.

Jetzt können Sie den Befehl oben ausführen und haben jetzt eine Anforderungsdatei, die nur die Module enthält, die Sie in der virtuellen Umgebung installiert haben. Jetzt können Sie den Befehl oben ausführen.

Ich rate jedem, Umgebungen zu verwenden, da dies die Dinge einfacher macht, wenn es um solche Dinge geht.

Hoffe das hat geholfen.


1

Wenn das gleiche Problem wie bei mir auftritt, z. B. nicht in der virtuellen Umgebung, und die Datei "require.txt" für ein bestimmtes Projekt oder aus dem ausgewählten Ordner (einschließlich untergeordneter Elemente ) und pipreqs nicht unterstützt wird.

Sie können verwenden:

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: Es kann einige zusätzliche Bibliotheken geben, da es auf Fuzzylogic überprüft.


1

Der beste Weg für Python 3 ist:

pip3 freeze > requirements.txt

es hat bei mir funktioniert ...


0

Wenn Sie PyCharm verwenden, wird beim Öffnen oder Klonen des Projekts in PyCharm eine Warnung angezeigt, in der Sie aufgefordert werden, alle erforderlichen Pakete zu installieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.