通过f1.py批量修改同目录下Python文件的print内容并运行所有文件
解决方案
我来给你一步步实现这个需求,直接上代码和解释,保证清晰易懂:
核心思路
要完成这个任务,我们需要分三步走:
- 从f1.py自身提取
print函数里的目标字符串(也就是"ABCD") - 替换f2.py、f3.py中
print函数的输出内容 - 执行目录下所有的Python文件
完整的f1.py代码
import re import subprocess import os # 第一步:从f1.py自身提取print的字符串 def get_f1_print_str(): # 读取当前文件(f1.py)的内容 with open(__file__, 'r', encoding='utf-8') as f: content = f.read() # 用正则匹配print("xxx")格式的语句,提取引号内的内容 match = re.search(r'print\("(.*?)"\)', content) if match: return match.group(1) else: raise ValueError("在f1.py中未找到符合格式的print语句") # 第二步:替换目标文件中的print字符串 def replace_print_str(target_files, new_str): # 匹配print语句的正则,捕获引号前后的部分,方便替换 pattern = re.compile(r'(print\(").*?("\))') for file in target_files: with open(file, 'r', encoding='utf-8') as f: content = f.read() # 替换print语句中的字符串 new_content = pattern.sub(rf'\1{new_str}\2', content) # 写回文件 with open(file, 'w', encoding='utf-8') as f: f.write(new_content) print(f"已更新文件: {file}") # 第三步:运行目录下所有Python文件 def run_all_py_files(): # 获取当前目录下所有.py文件 py_files = [f for f in os.listdir('.') if f.endswith('.py')] for file in py_files: print(f"开始运行: {file}") # 用subprocess运行Python文件,输出结果 result = subprocess.run(['python', file], capture_output=True, text=True) print(f"{file} 运行输出:\n{result.stdout}") if result.stderr: print(f"{file} 错误信息:\n{result.stderr}") if __name__ == "__main__": try: # 获取f1的print字符串 f1_print_str = get_f1_print_str() # 指定要修改的目标文件 target_files = ['f2.py', 'f3.py'] # 替换内容 replace_print_str(target_files, f1_print_str) # 运行所有py文件 run_all_py_files() except Exception as e: print(f"执行出错: {str(e)}")
关键细节说明
- 正则匹配:用
re.search和re.sub精准定位和替换print语句,确保只修改print("xxx")格式的内容,不会误改注释里的字符串 - 文件读写:使用
utf-8编码保证兼容性,建议先备份f2.py和f3.py再测试,避免意外覆盖内容 - 运行文件:用
subprocess.run执行每个Python文件,同时捕获标准输出和错误输出,方便查看运行结果
测试效果
运行f1.py后,f2.py和f3.py里的print("EFGH")会被替换成print("ABCD"),然后三个文件会依次运行,最终输出三次"ABCD"。
内容的提问来源于stack exchange,提问作者Cat Licker
相关产品推荐
相关产品推荐

