Python之格式化Conda中生成的requirements.txt
在conda中生成的requirements.txt如下
bidict @ file:///tmp/build/80754af9/bidict_1607541094382/work
blinker @ file:///C:/b/abs_d9y2dm7cw2/croot/blinker_1696539752170/work
click @ file:///C:/b/abs_f9ihnt72pu/croot/click_1698129847492/work
colorama @ file:///C:/b/abs_a9ozq0l032/croot/colorama_1672387194846/work
Flask @ file:///C:/b/abs_f9w7doyu0h/croot/flask_1716545924884/work
Flask-Cors==5.0.0
Flask-SocketIO @ file:///C:/b/abs_4fl4yt4uvo/croot/flask-socketio_1669060222784/work
importlib-metadata @ file:///C:/b/abs_c1egths604/croot/importlib_metadata-suite_1704813568388/work
itsdangerous @ file:///C:/b/abs_c4vwgdr5yn/croot/itsdangerous_1716533399914/work
Jinja2 @ file:///C:/b/abs_92fccttino/croot/jinja2_1716993447201/work
MarkupSafe @ file:///C:/b/abs_ecfdqh67b_/croot/markupsafe_1704206030535/work
python-engineio @ file:///tmp/build/80754af9/python-engineio_1618814346232/work
python-socketio @ file:///tmp/build/80754af9/python-socketio_1624540179952/work
PyYAML @ file:///C:/b/abs_14xkfs39bx/croot/pyyaml_1728657968772/work
Werkzeug @ file:///C:/b/abs_8bittcw9jr/croot/werkzeug_1716533366070/work
zipp @ file:///C:/b/abs_021kqswk3k/croot/zipp_1729012371206/work
列出的依赖列表包含了一些通过本地文件路径安装的包(如 @ file:///...
)
这些路径是特定于你当前环境的构建路径,在其他环境中直接使用可能会导致问题
可以通过如下脚本进行格式化:
import subprocess
import sysimport chardetwith open("requirements.txt", "rb") as f:result = chardet.detect(f.read(10000)) # 读取部分文件内容进行检测encoding = result['encoding']print(f"文件编码格式: {encoding}")clean_requirements = []
with open("requirements.txt", "r", encoding=encoding) as f:for pkg in f.readlines():if "@ file://" in pkg:# 提取包名(如 "Flask @ file://..." -> "Flask")pkg_name = pkg.split("@")[0].strip()# 获取该包的 PyPI 版本try:version = subprocess.check_output([ sys.executable, "-m", "pip", "show", pkg_name]).decode("utf-8")version_line = [line for line in version.splitlines() if line.startswith("Version:")][0]version_num = version_line.split(":")[1].strip()clean_requirements.append(f"{pkg_name}=={version_num}")except:# 如果无法获取版本,保留原始行(可能需要手动处理)clean_requirements.append(pkg)else:clean_requirements.append(pkg)# 写入 requirements.txt
with open("requirements.txt", "w") as f:f.write("\n".join(clean_requirements))
格式化后的requirements.txt如下
bidict==0.21.2
blinker==1.6.2
click==8.1.7
colorama==0.4.6
Flask==3.0.3
Flask-Cors==5.0.0Flask-SocketIO==5.3.1
importlib-metadata==7.0.1
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.3
python-engineio==4.1.0
python-socketio==5.3.0
PyYAML==6.0.2
Werkzeug==3.0.3
zipp==3.20.2