如何通过Python切换到指定路径并执行CMD批处理命令?
我想要自动化构建流程,常规操作是进入存放make脚本的文件夹,打开CMD执行类似Bootstrap_make.bat /fic = Foo的命令。现在想用Python实现:切换到指定路径、打开CMD并执行命令。
我尝试了以下代码:
def myClick(): subprocess.run(["cd ..\Projects\ADAS\proj11\embedded_env\make_scripts" ]) subprocess.run(["bootstrap_make.bat","/fic= my_software_variant"])
但出现如下错误:
Traceback (most recent call last):
File "C:\Users\aelkhate\AppData\Local\Programs\Python\Python310\lib\tkinter_init_.py", line 1921, in call
return self.func(*args)
File "C:\E\ProductOne_Builder1.py", line 5, in myClick
subprocess.run(["cd ..\Projects\ADAS\proj11\embedded_env\make_scripts" ])
File "C:\Users\aelkhate\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 501, in run
with Popen(*popenargs, **kwargs) as process:
File "C:\Users\aelkhate\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 966, in init
self._execute_child(args, executable, preexec_fn, close_fds,
File "C:\Users\aelkhate\AppData\Local\Programs\Python\Python310\lib\subprocess.py", line 1435, in _execute_child
hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
FileNotFoundError: [WinError 2] The system cannot find the file specified
请问该如何实现并解决报错?
问题原因与解决方法
错误根源
cd是CMD的内置命令,并非独立可执行文件,直接用subprocess.run调用会触发"找不到文件"错误——subprocess默认只会查找系统中的可执行程序,不识别shell内置命令。- 两次
subprocess.run调用是完全独立的进程,第一次切换路径的操作不会影响第二次进程的工作目录。
正确实现方案
方案一:通过cwd参数指定工作目录
直接在执行bat脚本时指定工作目录,无需单独执行cd命令:
import subprocess def myClick(): # 用原始字符串避免反斜杠转义问题 target_dir = r"..\Projects\ADAS\proj11\embedded_env\make_scripts" # cwd参数指定命令执行的工作目录,等同于先cd到该目录再执行脚本 subprocess.run(["bootstrap_make.bat", "/fic=my_software_variant"], cwd=target_dir, shell=True)
shell=True:Windows下需开启该参数,让CMD解析bat脚本的语法。cwd:直接让子进程在目标目录启动,替代手动cd操作。
方案二:通过shell执行完整命令串
如果需要完全模拟手动在CMD中输入的流程,可以将cd和执行命令合并为一个shell命令:
import subprocess def myClick(): # 用&&连接两个命令,仅当前一个命令执行成功时才运行后一个 cmd = r'cd ..\Projects\ADAS\proj11\embedded_env\make_scripts && bootstrap_make.bat /fic=my_software_variant' subprocess.run(cmd, shell=True)
- 必须开启
shell=True,否则无法解析cd和&&这类shell语法。
额外注意事项
- 路径含空格时:需用双引号包裹路径,例如
r'"..\path with spaces\make_scripts"'。 - 权限问题:若脚本需要管理员权限,可添加
creationflags=subprocess.CREATE_NEW_CONSOLE参数(仅Windows),或手动以管理员身份运行Python脚本。
内容的提问来源于stack exchange,提问作者ftkhateeb

