Python subprocess.call 不等待进程完成搅拌机

新手上路,请多包涵

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

我尝试使用 communcate 但它仍然没有用:

 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')

原文由 Tak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

您可以使用 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 模块在“启动”脚本中生成一个唯一的、不存在的绝对路径。
  • 启动脚本时,将您刚刚创建的路径作为参数传递。
  • 当脚本启动时,让它在路径中创建一个文件。完成后,删除文件。
  • 启动脚本应该监视该文件的创建和删除以指示脚本的状态。

希望这是有道理的。

原文由 joebeeson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题