我在搅拌机里有一个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()

我试着用逗号,但还是没用:
p1 = subprocess.Popen(os.path.abspath('D:/Test/run-my-script.sh'),shell=True).communicate()

这个shell脚本在MacOS上很好地工作(在更改路径之后),并在使用时等待。
但在Windows上,这就是发生的事情,我在Blender中运行下面的python脚本,然后一旦它到达子进程行,就会打开并运行shell脚本,而Blender并不等待它完成,而是在控制台中打印subprocess.call(['sh', '/userA/Test/run-my-script.sh'])而不等待git bash完成。有什么帮助吗?
import bpy
import subprocess
subprocess.call(os.path.abspath('D:/Test/run-my-script.sh'),shell=True)
print('Hello')

最佳答案

您可以使用subprocess.call来实现这一点。
subprocess.call(args,*,stdin=none,stdout=none,stderr=none,shell=false,timeout=none)
运行args描述的命令。等待命令完成,然后返回返回代码属性。
编辑:我想我对发生的事情有预感。这个命令在你的Mac上有效,因为我相信Mac支持bash-out-of-the-box(至少在功能上相当),而在Windows上,它看到你试图运行一个“.sh”文件,而不是启动git-bash,我认为它在启动时会执行几个分叉。
因为这个python认为脚本已经完成,所以pid就不存在了。
如果我是你,我会这样做:
使用tempfile模块在“启动”脚本中生成唯一的、不存在的绝对路径。
启动脚本时,传递刚才作为参数创建的路径。
当脚本启动时,让它在路径上创建一个文件。完成后,删除文件。
启动脚本应该监视该文件的创建和删除,以指示脚本的状态。
希望这是有道理的。

关于python - Python subprocess.call没有等待进程完成blender,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43358019/

10-16 20:31