Créez automatiquement requirements.txt

278

Parfois, je télécharge le code source de python githubet je ne sais pas comment installer toutes les dépendances. S'il n'y a pas de requirements.txtfichier, je dois le créer à la main. La question est: étant donné le répertoire du code source python, est-il possible de créer requirements.txtautomatiquement à partir de la section d'importation?

Igor Barinov
la source
2
Vous pouvez le faire en exécutant pip freeze > requirements.txtenregistrer toutes vos bibliothèques python avec la version actuelle dans un requirements.txtfichier
Shaikhul
7
@Shaikhul mais cela n'aide pas dans le cas où les dépendances ne sont pas installées parce que vous venez de télécharger le paquet depuis GitHub ...
jonrsharpe
8
Veuillez noter: a) pip freezeaffichera les versions actuelles des allmodules installés sur ce système indépendamment de leur utilisation dans le projet en cours. b) pip ne listera que les modules qui ont été installés via pip
akskap
Copie possible de Comment créer un fichier requirements.txt?
Daniel Santos

Réponses:

291

Si vous utilisez un environnement virtuel, pip freeze > requirements.txttrès bien. SINON , pigar sera un bon choix pour vous.

Soit dit en passant, je ne m'assure pas que cela fonctionnera avec 2.6.

MISE À JOUR :

Pipenv ou d'autres outils sont recommandés pour améliorer votre flux de développement.

Pour Python 3, utilisez ci-dessous

pip3 freeze > requirements.txt
damnever
la source
3
Pour quiconque fait une erreur, je recommande d'essayer pip3 freeze > requirements.txtavant de poser une question.
baranskistad
3
J'exécute pip3 freeze > requirements.txtet je suis surpris de ne pas trouver certains packages que j'utilise tels que argparseet configparser. Est-ce parce qu'ils font partie du noyau Python? Je crois qu'une meilleure réponse est d'utiliser pipreqsci-dessous car elle ne listera que les exigences de votre projet.
Alexis.Rolland
@ Alexis.Rolland Oui, argparseet configparserappartient à la bibliothèque standard Python3, alors, qu'est-ce qui ne va pas pip3 freeze? Je ne comprends pas votre point.
damnever
11
@damnever Ok merci! pip3 freezeme donne la liste de tous les packages Python installés dans mon environnement alors que pipreqsme donne tous ceux réellement utilisés dans mon code source qui est ce que je cherchais. A part ça, rien de mal à ça.
Alexis.Rolland
1
pipenv a de sérieux problèmes, voir cette discussion: news.ycombinator.com/item?id=18612590
Justin M. Keyes
364

Vous pouvez utiliser le code suivant pour générer un fichier requirements.txt:

pip install pipreqs

pipreqs /path/to/project

plus d'informations sur les pipreqs peuvent être trouvées ici .

Parfois, vous rencontrez pip freeze, mais cela enregistre tous les packages dans l'environnement, y compris ceux que vous n'utilisez pas dans votre projet actuel.

DJanssens
la source
1
@IgorBarinov est un avertissement et ne créera pas de problème à exécuter pipreqs, je l'ai installé sur python 2.6 et j'ai reçu le même avertissement, mais il crée un requirements.txtfichier, merci @DJanssens
Shaikhul
1
@Shaikhul si vous avez reçu ces avertissements, vous n'aurez pas de fichier complet, vous obtiendrez simplement une partie des exigences. Vous pouvez le vérifier sur github.com/npow/MemNN/tree/hyperopt repo. Je n'ai que 'hyperopt == 0.0.2 numpy == 1.9.2 scikit_learn == 0.16.1 theano == 0.7.0'
Igor Barinov
1
cela dit it is strongly recommended to upgrade to a newer Python version
Shaikhul
2
Excellent outil. Merci! La puissante caractéristique de celui-ci est qu'il génère exactement les packages utilisés, pas comme pip freeze!
Wesam Na
1
Cela ne fonctionne pas pour Python 3.6, si le nouveau formatage de sortie de l'instruction d'impression est uesd.
Anand CU
12

Dans mon cas, j'utilise Anaconda, donc l'exécution de la commande suivante à partir du terminal conda dans mon environnement l'a résolu et a créé ce fichier txt d'exigences pour moi automatiquement:

conda list -e > requirements.txt

Ceci est tiré de ce lien Github pratos / condaenv.txt

Si une erreur a été détectée et que vous utilisez anaconda, essayez d'utiliser l'option .yml:

conda env export > <environment-name>.yml

Pour qu'une autre personne utilise l'environnement ... Ou si vous créez un nouvel environnement sur une autre machine: conda env create -f .yml

L'option .yml a été trouvée ici

HassanSh__3571619
la source
si vous n'utilisez pas un environnement virtuel, cela créera un fichier requirements.txt trop long
SBFRF
1
Est-ce que cela fonctionne réellement? Chaque fois que j'ai essayé cela, il y a des dépendances et des détails de syntaxe qui pip install requirements.txtrejettent.
conner.xyz
J'ai trouvé quelques erreurs en utilisant le .txt, alors j'ai juste ajouté l'autre option qui fonctionnait aussi avec moi ... "Utilisation du .yml" mentionné ci-dessus.
HassanSh__3571619
5

Assurez-vous d'exécuter pip3 pour python3.7.

pip3 freeze >> yourfile.txt

Avant d'exécuter la commande ci-dessus, assurez-vous d'avoir créé un environnement virtuel.

python3:

pip3 install virtualenv
python3 -m venv <myenvname> 

python2 :

pip install virtualenv
virtualenv <myenvname>

Après cela, mettez votre code source dans le répertoire. Si vous exécutez le fichier python maintenant, il ne se lancera probablement pas si vous utilisez des modules non natifs. Vous pouvez installer ces modules en cours d'exécution

pip3 install <module> or pip install <module> 

Cela ne vous affectera pas la liste complète des modules, sauf l'environnement dans lequel vous vous trouvez.

Vous pouvez maintenant exécuter la commande en haut et vous avez maintenant un fichier d'exigences qui contient uniquement les modules que vous avez installés dans l'environnement virtuel. Vous pouvez maintenant exécuter la commande en haut.

Je conseille à tout le monde d'utiliser des environnements car cela facilite les choses quand il s'agit de choses comme ça.

J'espère que cela vous a aidé.

johnyjohnny
la source
1

Si vous rencontrez le même problème que le mien, c'est-à-dire pas sur l'environnement virtuel et que vous souhaitez requirements.txt pour un projet spécifique ou à partir du dossier sélectionné (inclut les enfants) et pipreqs ne prend pas en charge.

Vous pouvez utiliser :

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: Il peut avoir quelques bibliothèques supplémentaires lors de la vérification de fuzzylogic.

DARK_C0D3R
la source
1

le meilleur moyen pour Python 3 est:

pip3 freeze > requirements.txt

ça a marché pour moi ...

Mac Rathod
la source
0

si vous utilisez PyCharm, lorsque vous ouvrez ou clonez le projet dans PyCharm, il affiche une alerte et vous demande d'installer tous les packages nécessaires.

Ahmet
la source