web-dev-qa-db-fra.com

Créer automatiquement des exigences.txt

Parfois, je télécharge le code source Python à partir de github et je ne sais pas comment installer toutes les dépendances. S'il n'y a pas de fichier requirements.txt, 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.txt automatiquement à partir de la section d'importation?

145
Igor Barinov

Si vous utilisez un environnement virtuel, pip freeze > requirements.txt convient parfaitement. Si non, pigar sera un bon choix pour vous.

En passant, je ne m'assure pas que cela fonctionnera avec la version 2.6.

METTRE À JOUR:

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

152
damnever

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

pip install pipreqs

pipreqs /path/to/project

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

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

210
DJanssens

Assurez-vous de lancer pip3 pour python3.7.

pip3 freeze >> yourfile.txt

Il devrait s'agir soit d'un problème de compatibilité, soit d'un bug indiquant que ce problème ne fonctionne pas. Assurez-vous d'aller dans le fichier "gelé" et supprimez tout module dont vous n'avez pas besoin. C'est la façon dont j'ai travaillé autour de cela. :)

0
johnyjohnny

Si le même problème que le mien, c’est-à-dire pas sur l’environnement virtuel et veut 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))

P.S: Il peut avoir quelques bibliothèques supplémentaires car il vérifie fuzzylogic.

0
TheVishal

Dans mon cas, j'utilise Anaconda. L'exécution de la commande suivante à partir de conda terminal dans mon environnement a résolu le problème et créé ce fichier txt d'exigences pour moi automatiquement:

conda list -e > requirements.txt

Ceci a été pris de ce lien Github pratos/condaenv.txt

0
HassanSh__3571619