You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:30:13