時々私はgithub
からpythonソースコードをダウンロードし、すべての依存関係をインストールする方法を知らない。 requirements.txt
ファイルがない場合は、手作業で作成する必要があります。質問は次のとおりです。Pythonのソースコードディレクトリを考えると、インポートセクションから自動的にrequirements.txt
を作成することは可能ですか?
次のコードを使用して、requirements.txtファイルを生成できます。
pip install pipreqs
pipreqs /path/to/project
pipreqに関するより詳しい情報はこちら にあります 。
ときどきpip freeze
に出くわすことがありますが、これは現在のプロジェクトで使用していないものも含め、環境内のすべてのパッケージを保存します。
私の場合は、Anacondaを使用しています。したがって、環境内でconda端末から次のコマンドを実行して問題を解決し、この要件テキストファイルを自動的に作成しました。
conda list -e > requirements.txt
これはこのGithubリンクから取得したものです pratos/condaenv.txt
必ずpython3.7用にpip3を実行してください。
pip3 freeze >> yourfile.txt
それは互換性の問題か、それとも 'pip'だけが機能しないというバグのどちらかであるべきです。 「フリーズ」ファイルに移動して、不要なモジュールを削除してください。これは私がそれを回避した方法です。 :)
私と同じ問題に直面している場合(つまり、仮想環境ではなく)、特定のプロジェクトの要件.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をチェックするため、追加のライブラリがいくつかある場合があります。