Python如何向subprocess子进程传递路径变量执行CMD命令
问题排查
你的代码有两处核心错误,才会导致报错+功能不符合预期:
- 函数定义时声明了必须传入
test_path位置参数,但最后调用Test_Function()时没有传入任何参数,直接触发了你看到的missing 1 required positional argument报错。 - 对subprocess的运行逻辑理解有误:每一次
subprocess.call启动的都是独立的、和父进程隔离的子进程,第一次调用执行cd切目录的操作,只会在那个短命的子进程里生效,进程退出后环境就完全销毁了,第二次调用执行python命令时,工作目录还是主进程的默认目录,之前的cd操作完全没作用。
额外提醒:Windows下单独用cd命令跨盘符切换目录是不生效的,必须加/d参数,比如cd /d D:\test,这也是很多人踩过的坑。
正确实现方案
根本没必要单独调用cd命令,subprocess原生提供了cwd参数,直接指定子进程的运行工作目录即可,代码简洁还不会出进程隔离的问题:
import subprocess # 替换成你实际的目标目录路径 test_path = "C:/random_path/your_target_folder" def run_file_in_path(target_dir): # cwd参数直接指定子进程启动后的工作目录,等价于先cd到目标路径再执行命令 subprocess.call("python file.py", shell=True, cwd=target_dir) # 调用函数时记得把定义好的路径变量传进去 run_file_in_path(test_path)
可选优化
如果要规避shell=True带来的命令注入风险(官方推荐的安全写法),可以把命令拆成列表传入,不需要依赖shell解析:
subprocess.call(["python", "file.py"], cwd=target_dir)
如果要运行的不是python脚本,是目录下的exe、bat等其他文件,只需要替换对应执行命令即可,cwd参数的效果完全一致。
内容的提问来源于stack exchange,提问作者Senior Banan
相关产品推荐
相关产品推荐

