不使用import时如何从Python脚本传参运行另一个Python脚本
Python跨脚本exec传参实现方案(不导入目标脚本)
错误原因
你之前写的代码无法正常运行,核心问题有两个:
# 错误写法 exec(open("test2_main.py" "cat" "bat").read())
- Python会自动拼接相邻的字符串字面量,这行代码实际尝试打开路径为
test2_main.pycatbat的文件,必然触发文件不存在错误 - 即使路径填写正确,exec默认继承外层脚本的
sys.argv,不会自动加载你要传入的自定义参数,内层脚本自然读不到cat、bat
正确实现代码
你不需要修改内层test2_main.py的任何逻辑,只需要在外层脚本临时替换sys.argv再执行exec即可,运行效果和命令行直接执行python test2_main.py cat bat完全一致,全程不会导入目标脚本作为模块调用。test1_src.py参考代码:
import sys # 暂存外层原有启动参数,执行完内层脚本后恢复 old_args = sys.argv.copy() # 构造内层脚本的参数列表:首位是脚本名,后面依次是要传入的业务参数 sys.argv = ["test2_main.py", "cat", "bat"] # 读取并执行内层脚本 exec(open("test2_main.py", encoding="utf-8").read()) # 恢复外层原有参数,不影响外层后续逻辑运行 sys.argv = old_args
方案说明
- 内层脚本通过
sys.argv[1]、sys.argv[2]可正常获取cat、bat取值,和直接启动内层脚本的运行行为完全一致 - 执行完内层脚本后立即恢复外层原有参数,不会产生额外副作用
- 仅导入Python内置标准库sys,没有导入目标脚本模块,完全符合直接运行完整目标脚本的要求
注意:
open()仅用于读取目标脚本文件,只需要传入脚本文件路径即可,不要把传给脚本的业务参数写到open()的调用参数里。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

