web-dev-qa-db-ja.com

Requirements.txtを自動的に作成する

時々私はgithubからpythonソースコードをダウンロードし、すべての依存関係をインストールする方法を知らない。 requirements.txtファイルがない場合は、手作業で作成する必要があります。質問は次のとおりです。Pythonのソースコードディレクトリを考えると、インポートセクションから自動的にrequirements.txtを作成することは可能ですか?

166
Igor Barinov

仮想環境を使用している場合は、pip freeze > requirements.txtで結構です。そうでなければ、 pigar があなたにとって良い選択でしょう。

ところで、私はそれが2.6で動作することを保証するものではありません。

UPDATE

開発フローを改善するには、 Pipenv または他のツールをお勧めします。

164
damnever

次のコードを使用して、requirements.txtファイルを生成できます。

pip install pipreqs

pipreqs /path/to/project

pipreqに関するより詳しい情報はこちら にあります

ときどきpip freezeに出くわすことがありますが、これは現在のプロジェクトで使用していないものも含め、環境内のすべてのパッケージを保存します。

243
DJanssens

私の場合は、Anacondaを使用しています。したがって、環境内でconda端末から次のコマンドを実行して問題を解決し、この要件テキストファイルを自動的に作成しました。

conda list -e > requirements.txt

これはこのGithubリンクから取得したものです pratos/condaenv.txt

4

必ずpython3.7用にpip3を実行してください。

pip3 freeze >> yourfile.txt

それは互換性の問題か、それとも 'pip'だけが機能しないというバグのどちらかであるべきです。 「フリーズ」ファイルに移動して、不要なモジュールを削除してください。これは私がそれを回避した方法です。 :)

1
johnyjohnny

私と同じ問題に直面している場合(つまり、仮想環境ではなく)、特定のプロジェクトの要件.txtが必要な場合または選択したフォルダー(子を含む)からおよびpipreqsはサポートしていません。

を使用できます

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))

追伸:fuzzylogicをチェックするため、追加のライブラリがいくつかある場合があります。

0
TheVishal