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

使用subprocess.run()通过SSH远程执行命令时未等待进程完成的问题

远程执行命令时subprocess未等待完成就执行后续操作

我需要通过Python脚本在远程服务器上执行翻译命令(耗时数分钟),生成translated_file后将其复制到translations目录。但当前脚本中subprocess.run()未等待翻译命令完成就执行复制操作,导致文件不存在报错。

当前脚本:

subprocess.run(["ssh", "remote-server", "-f", "python", "-m", "sockeye.translate", "--models", "translation-model", "--input", "input_file", "--output", "translated_file"])

subprocess.run(["ssh", "remote-server", "-f", "cp", "translated_file", "translations"])

在远程服务器本地执行相同命令(移除ssh remote-server参数)时,subprocess.run()能正常等待翻译完成,本地执行命令如下:

subprocess.run(["python", "-m", "sockeye.translate", "--models", "translaiton-model", "--input", "input_file", "--output", "translated_file"])

subprocess.run(["cp", "translated_file", "translations"])

问题原因

问题出在ssh的-f参数上:这个参数会让ssh在后台执行远程命令,本地的subprocess.run()会立刻认为命令执行完成,不会等待远程的翻译任务结束,直接启动后续的复制命令,此时translated_file还未生成,自然报错。

解决方法

方法1:移除ssh的-f参数

去掉-f后,ssh会保持前台连接,直到远程命令完全执行完毕才退出,subprocess.run()会正常等待远程任务结束后再执行下一条命令。修改后的脚本:

subprocess.run(["ssh", "remote-server", "python", "-m", "sockeye.translate", "--models", "translation-model", "--input", "input_file", "--output", "translated_file"])

subprocess.run(["ssh", "remote-server", "cp", "translated_file", "translations"])

方法2:合并远程命令(更优)

将翻译和复制命令合并为一个ssh调用,用shell的&&连接,确保前一个命令执行成功后再执行下一个,减少ssh连接次数,提升效率:

subprocess.run([
    "ssh", "remote-server",
    "python -m sockeye.translate --models translation-model --input input_file --output translated_file && cp translated_file translations"
])

如果要明确指定shell执行命令,可添加-c参数:

subprocess.run([
    "ssh", "remote-server", "-c",
    "python -m sockeye.translate --models translation-model --input input_file --output translated_file && cp translated_file translations"
])

内容的提问来源于stack exchange,提问作者user15951645

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:17:41