Python subprocess.call不等待进程完成混合

2024-04-26 12:45:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我在搅拌机里有一个python脚本

subprocess.call(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)

接下来是许多其他的代码,这些代码依赖于这个shell脚本来完成。发生了什么事,它不等待它完成,我不知道为什么?我甚至尝试使用Popen而不是call,如图所示:

p1 = subprocess.Popen(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)
p1.wait()

我试着用commuincate但还是没用:

p1 = subprocess.Popen(os.path.abspath('D:/Test/run-my-script.sh'),shell=True).communicate()

这个shell脚本在MacOS上工作得很好(在更改路径之后),在使用subprocess.call(['sh', '/userA/Test/run-my-script.sh'])时会等待

但是在Windows上,这就是所发生的事情,我在Blender中运行下面的python脚本,然后当它到达子进程行Git bash时打开并运行shell脚本,Blender不等待它完成,它只是在控制台中打印Hello,而不等待Git Bash完成。有什么帮助吗?

import bpy
import subprocess
subprocess.call(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)
print('Hello')

Tags: pathruntest脚本trueosmysh
3条回答

默认情况下,subprocess.run将等待进程完成。

您可以使用subprocess.call来实现这一点。

subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False, timeout=None)

Run the command described by args. Wait for command to complete, then return the returncode attribute.

编辑:我想我对发生的事情有预感。这个命令在你的Mac上起作用,因为我相信Macs支持Bash的开箱即用(至少在功能上是等价的),而在Windows上,它看到你试图运行一个“.sh”文件,而是触发Git Bash,我认为它在启动时会执行几个fork。

因为Python认为脚本已经完成,所以PID已经消失。

如果我是你,我会这样做:

  • 使用^{}模块在“启动”脚本中生成唯一的、不存在的绝对路径。
  • 启动脚本时,请传递刚才作为参数创建的路径。
  • 当脚本启动时,让它在路径上创建一个文件。完成后,删除文件。
  • 启动脚本应监视该文件的创建和删除,以指示脚本的状态。

希望这是有意义的。

您可以使用Popen.communicate API。

p1 = subprocess.Popen(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)
sStdout, sStdErr = p1.communicate()

指挥部

Popen.communicate(input=None, timeout=None)

与进程交互:将数据发送到stdin。从stdout和stderr读取数据,直到到达文件末尾。等待进程终止。

相关问题 更多 >