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 读取数据,直到到达文件结尾。等待进程终止。
您可以使用它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模块在“启动”脚本中生成唯一的,不存在的绝对路径。希望这是有道理的。