Crea automaticamente requisito.txt


278

A volte scarico il codice sorgente di Python githube non so come installare tutte le dipendenze. Se non è presente alcun requirements.txtfile, devo crearlo manualmente. La domanda è: data la directory del codice sorgente di Python è possibile creare requirements.txtautomaticamente dalla sezione di importazione?


2
Puoi farlo eseguendo pip freeze > requirements.txtsalverà tutte le tue librerie Python con la versione corrente in requirements.txtfile
Shaikhul

7
@Shaikhul ma questo non aiuta nel caso in cui non hai installato le dipendenze perché hai appena scaricato il pacchetto da GitHub ...
jonrsharpe,

8
Nota: a) pip freezescaricherà le versioni correnti dei allmoduli installati su quel sistema indipendentemente dall'utilizzo nel progetto corrente. b) pip elencherà solo i moduli che sono stati installati tramite pip
akskap il

Risposte:


290

Se usi l'ambiente virtuale, va pip freeze > requirements.txtbene. In caso contrario , il maiale sarà una buona scelta per te.

A proposito, non assicuro che funzionerà con 2.6.

AGGIORNAMENTO :

Pipenv o altri strumenti sono consigliati per migliorare il flusso di sviluppo.

Per Python 3 utilizzare di seguito

pip3 freeze > requirements.txt

3
Per tutti gli errori, consiglio di provare pip3 freeze > requirements.txtprima di porre una domanda.
baranskistad,

3
Eseguo pip3 freeze > requirements.txte sono sorpreso di non trovare alcuni pacchetti che sto effettivamente usando come argparsee configparser. È perché fanno parte del core di Python? Credo che una risposta migliore debba essere usata di pipreqsseguito perché elenca solo i requisiti utilizzati dal progetto.
Alexis.Rolland,

@ Alexis.Rolland Sì, argparsee configparserappartiene alla libreria standard Python3, quindi, cosa c'è che non va pip3 freeze? Non capisco il tuo punto.
Damnever

11
@damnever Ok grazie! pip3 freezemi dà l'elenco di tutti i pacchetti Python installati nel mio ambiente mentre pipreqsmi dà tutti quelli effettivamente utilizzati nel mio codice sorgente, che è quello che stavo cercando. Inoltre, non c'è niente di sbagliato in questo.
Alexis.Rolland il

1
pipenv ha seri problemi, vedi questa discussione: news.ycombinator.com/item?id=18612590
Justin M. Keyes

364

È possibile utilizzare il seguente codice per generare un file requisito.txt:

pip install pipreqs

pipreqs /path/to/project

maggiori informazioni relative ai pipreq sono disponibili qui .

A volte ti imbatti pip freeze, ma questo salva tutti i pacchetti nell'ambiente inclusi quelli che non usi nel tuo progetto attuale.


1
@IgorBarinov è un avvertimento e non creerà un problema da eseguire pipreqs, l'ho installato su Python 2.6 e ho ricevuto lo stesso avvertimento ma crea un requirements.txtfile, grazie @DJanssens
Shaikhul

1
@Shaikhul se ricevi questi avvisi non avrai un file completo, otterrai solo una parte dei requisiti. Puoi controllarlo su github.com/npow/MemNN/tree/hyperopt repo. Ho solo 'hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0'
Igor Barinov

1
che diceva it is strongly recommended to upgrade to a newer Python version
Shaikhul il

2
Ottimo strumento. Grazie! La potente funzione che genera esattamente i pacchetti utilizzati, non come il congelamento del pip!
Wesam,

1
Questo non funziona per Python 3.6, se la formattazione dell'output della nuova istruzione di stampa è uesd.
Anand CU

12

Nel mio caso, utilizzo Anaconda, quindi eseguendo il seguente comando dal terminale conda all'interno del mio ambiente lo ho risolto e creato automaticamente questo file txt di requisiti per me:

conda list -e > requirements.txt

Questo è stato preso da questo link Github pratos / condaenv.txt

Se si è verificato un errore e si utilizza anaconda, provare a utilizzare l'opzione .yml:

conda env export > <environment-name>.yml

Per altre persone di utilizzare l'ambiente ... O se si sta creando un nuovo ambiente su un'altra macchina: conda env create -f .yml

L'opzione .yml è stata trovata qui


se non si utilizza un ambiente virtuale, verrà creato un file Requisito.txt troppo lungo
SBFRF

1
Funziona davvero? Ogni volta che ho provato questo, ci sono dipendenze e particolari di sintassi che pip install requirements.txtrifiutano.
conner.xyz,

Ho trovato alcuni errori usando il .txt, quindi ho aggiunto anche l'altra opzione che ha funzionato anche con me ... "Usare il .yml" di cui sopra.
HassanSh__3571619

5

Assicurati di eseguire pip3 per python3.7.

pip3 freeze >> yourfile.txt

Prima di eseguire il comando sopra riportato, assicurarsi di aver creato un ambiente virtuale.

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

Dopodiché inserisci il tuo codice sorgente nella directory. Se esegui ora il file Python, probabilmente non verrà avviato Se stai utilizzando moduli non nativi. È possibile installare quei moduli in esecuzione

pip3 install <module> or pip install <module> 

Ciò non influirà sull'intero elenco di moduli tranne l'ambiente in cui ci si trova.

Ora puoi eseguire il comando in alto e ora hai un file dei requisiti che contiene solo i moduli installati nell'ambiente virtuale. Ora puoi eseguire il comando in alto.

Consiglio a tutti di usare gli ambienti in quanto semplifica le cose quando si tratta di cose come questa.

Spero che questo abbia aiutato.


1

Se affrontare lo stesso problema del mio, cioè non nell'ambiente virtuale e desidera Requisit.txt per un progetto specifico o dalla cartella selezionata (include i figli) e pipreqs non è supportato.

Puoi usare :

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: potrebbe avere alcune librerie aggiuntive mentre controlla fuzzylogic.


1

il modo migliore per Python 3 è:

pip3 freeze > requirements.txt

ha funzionato per me ...


0

se stai usando PyCharm, quando apri o cloni il progetto in PyCharm mostra un avviso e ti chiede di installare tutti i pacchetti necessari.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.