为某些python脚本,没有requirements.txt,自动分析其依赖,进行自动安装. 下面介绍两种方法 pigar仅打包当前目录下python文件的依赖。安装命令如下:pip工具
pip install pigar # 安装工具
pigar generate #生成requirements.txt
自定义脚本
import os
import ast
import subprocess
def dir_files(directory, extension):
"""遍历目录内指定后缀"""
file_list = []
for root, dirs, files in os.walk(directory):
for file in files:
if file.endswith(extension):
if "tempCodeRunnerFile" not in file: # CodeRunner生成的临时文件忽略掉
file_list.append(os.path.join(root, file))
return file_list
def parse_imports(filename):
"""解析python源文件import了哪些库"""
with open(filename, "r", encoding="utf-8") as f:
tree = ast.parse(f.read())
imports = set()
for node in ast.iter_child_nodes(tree):
if isinstance(node, ast.Import):
for alias in node.names:
imports.add(alias.name.split(".")[0])
elif isinstance(node, ast.ImportFrom):
module_name = node.module.split(".")[0] if node.module else ""
for alias in node.names:
imports.add(module_name + "." + alias.name.split(".")[0])
return list(imports)
def pip_install(libraries):
"""判断是否安装了库 没有就直接pip安装"""
for library in libraries:
library = library.split(".")[0]
try:
__import__(library)
except ImportError:
print(f"{library} 没有安装,正在使用pip安装...")
subprocess.call(["pip", "install", library])
if __name__ == "__main__":
# 指定项目文件夹路径
python_file_folders = [r"D:\\project\\"]
# 查找项目中的Python文件
python_files = []
for folder in python_file_folders:
python_files += dir_files(folder, ".py") + dir_files(folder, ".pyw")
print("找到的Python文件:", python_files)
# 解析Python文件中的依赖库
all_imports = []
for python_file in python_files:
imports = parse_imports(python_file)
all_imports += [library.split(".")[0] for library in imports]
print("项目中使用的依赖库:", all_imports)
# 自动安装依赖库
if all_imports:
imports = set(all_imports)
pip_install(imports)
参考