Python subprocess.call没有等待进程完成blender

Tak*_*Tak 10 python shell subprocess blender git-bash

我在blender中有一个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()
Run Code Online (Sandbox Code Playgroud)

我尝试使用commuincate但它仍然无法正常工作:

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

这个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')
Run Code Online (Sandbox Code Playgroud)

小智 7

您可以使用 Popen.communicate API。

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

命令

Popen.communicate(input=None, timeout=None)
Run Code Online (Sandbox Code Playgroud)

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


joe*_*oeb 6

您可以使用它subprocess.call来做到这一点。

子流程。调用args,*,stdin = None,stdout = None,stderr = None,shell = False,timeout = None

运行args描述的命令。等待命令完成,然后返回returncode属性。

编辑:我想我对发生的事情有预感。该命令在Mac上有效,因为我认为Mac支持开箱即用的Bash(至少在功能上等效),而在Windows上它会看到您尝试运行“ .sh”文件,并启动了我认为执行的Git Bash启动时有几个叉子。

由于此Python 认为您的脚本已完成,因此PID消失了。

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

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

希望这是有道理的。


Grr*_*Grr 2

subprocess.run默认情况下将等待该过程完成。