如何用Python的Popen执行指定命令并切换工作目录
解决方案
1. 正确构造subprocess.Popen调用
由于call是Windows CMD的内部命令,无法直接作为Popen的可执行文件使用,必须通过cmd.exe来解析执行整个命令序列。用&&连接两个命令可确保批处理执行完成后再运行LS-DYNA程序(若无需依赖批处理执行结果,可替换为&)。
代码示例:
import subprocess # 定义各路径(用原始字符串避免转义问题) bat_path = r"E:/Ansys/ANSYS Inc/v222/ansys/bin/winx64/lsprepost48/lsdynamsvar.bat" lsdyna_exe = r"E:/Ansys/ANSYS Inc/v222/ansys/bin/winx64/lsdyna_sp.exe" k_file = r"C:/Users/User/Desktop/ls-dyna_python/Project_1/qd_env/1/projects/1_1_1/1_1_1.k" work_dir = r"C:/Users/User/Desktop/Work/" # 替换为你的完整工作目录路径 # 构造CMD可识别的命令字符串 cmd_str = f'call "{bat_path}" && "{lsdyna_exe}" i="{k_file}" ncpu=1 memory=20m' # 启动进程 process = subprocess.Popen( ["cmd", "/c", cmd_str], cwd=work_dir, # 指定执行命令的工作目录 stdout=subprocess.DEVNULL, # 忽略标准输出 stderr=subprocess.DEVNULL # 忽略错误输出 ) # 等待进程执行完成 process.wait()
2. 关键细节说明
cmd /c:让CMD执行完指定命令后自动退出,替代你之前用的/k(保持窗口打开),更适合后台执行场景。cwd参数:直接通过Popen参数指定工作目录,无需手动切换,这是subprocess模块推荐的标准方式。- 路径加引号:所有包含空格的路径(比如
ANSYS Inc)必须用双引号包裹,避免CMD解析路径时出错。 - 忽略输出:通过
DEVNULL丢弃所有输出,符合你无需关注执行结果的需求。
3. 之前尝试失败的原因
- 直接传入完整命令字符串:Popen默认会把整个字符串当作可执行文件路径,而非通过CMD解析,因此无法识别
call这类内部命令。 - 使用
['call', ...]传参:call是CMD内部命令,不是独立的可执行程序,系统找不到对应的call.exe,导致执行失败。
内容的提问来源于stack exchange,提问作者Talgos_n
相关产品推荐
相关产品推荐

