编写生成 requirements.txt
文件的 Python 脚本
要编写一个生成 requirements.txt
文件的 Python 脚本,可以通过分析当前环境中已安装的 Python 包,或者从指定的 Python 脚本文件中解析出所需的依赖包。以下是一个简单的 Python 脚本,用于生成 requirements.txt
文件。
方案1(旧版):基于已安装的包生成 requirements.txt
这个方法将列出当前 Python 环境中所有已安装的包,并将它们写入 requirements.txt
文件。
import pkg_resources
def generate_requirements(output_file='requirements.txt'):
# 获取当前环境中的所有已安装的包及其版本号
installed_packages = pkg_resources.working_set
requirements = sorted(["{}=={}".format(i.key, i.version) for i in installed_packages])
# 将包信息写入 requirements.txt 文件
with open(output_file, 'w') as f:
for req in requirements:
f.write(req + '\n')
print(f"Requirements have been generated and saved to {output_file}.")
if __name__ == "__main__":
generate_requirements()
** 适用于生成基于当前环境的 requirements.txt
文件,只需运行脚本即可。
pkg_resources
已被标记为过时(deprecated),推荐使用 importlib.metadata
或者 pip
模块来替代它。我们可以通过使用 pip
模块来获取当前环境中的已安装包并生成 requirements.txt
文件。下面是改进后的脚本:
方案2(新版):
使用 pip
模块生成 requirements.txt
import subprocess
def generate_requirements(output_file='requirements.txt'):
# 使用 pip freeze 获取当前环境中的已安装包及其版本号
result = subprocess.run(['pip', 'freeze'], stdout=subprocess.PIPE)
requirements = result.stdout.decode('utf-8').splitlines()
# 将包信息写入 requirements.txt 文件
with open(output_file, 'w') as f:
for req in requirements:
f.write(req + '\n')
print(f"Requirements have been generated and saved to {output_file}.")
if __name__ == "__main__":
generate_requirements()
使用说明
- 这个脚本使用
pip freeze
命令获取当前 Python 环境中的所有已安装包及其版本信息。 - 然后将这些信息写入到
requirements.txt
文件中。
改进后的优点
- 该方法避免了使用已弃用的
pkg_resources
,使用更现代的pip
工具,符合最新的最佳实践。 - 兼容性强,适用于大多数环境,并且直接使用了 Python 官方推荐的工具。
运行方式
直接运行上述脚本即可生成 requirements.txt
文件,不会再出现 DeprecationWarning
警告。
更好的方案:
更好的方案,可以避免使用 subprocess
调用外部命令,而是直接使用 Python 官方库 importlib.metadata
(适用于 Python 3.8 及更高版本)来获取已安装的包信息。这种方法更加简洁,也没有调用外部命令的开销。
方案3(最佳版):
使用 importlib.metadata
生成 requirements.txt
import importlib.metadata
import sys
def generate_requirements(output_file='requirements.txt'):
# 获取当前环境中的所有已安装包及其版本号
packages = importlib.metadata.distributions()
requirements = sorted(f"{package.metadata['Name']}=={package.version}" for package in packages)
# 将包信息写入 requirements.txt 文件
with open(output_file, 'w') as f:
for req in requirements:
f.write(req + '\n')
print(f"Requirements have been generated and saved to {output_file}.")
if __name__ == "__main__":
if sys.version_info < (3, 8):
print("This script requires Python 3.8 or higher.")
else:
generate_requirements()
使用说明
- 该脚本利用了
importlib.metadata.distributions()
函数,它能够列出当前 Python 环境中所有已安装的包及其版本。 - 这种方式纯粹使用 Python 内置的功能,没有外部依赖,也不会有任何过时或弃用的 API 警告。
方案优点
- 无需外部依赖:完全使用 Python 标准库,无需依赖
pip
或其他外部工具。 - 性能和安全性:直接在 Python 进程中执行,无需调用外部命令,减少了潜在的安全风险和开销。
- 易于维护:使用 Python 官方推荐的方法,更符合现代 Python 开发的最佳实践。
运行方式
- 确保 Python 版本为 3.8 或更高版本,然后直接运行脚本生成
requirements.txt
文件。 - 如果运行环境低于 Python 3.8,脚本会输出提示信息。
通过这种方式生成 requirements.txt
文件,是目前更现代和推荐的解决方案。