使用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
相关产品推荐
相关产品推荐

