【发布时间】:2011-08-31 10:42:16
【问题描述】:
我正在尝试检测安装程序何时从 Python 脚本中完成执行。具体来说,该应用程序是 Oracle 10gR2 数据库。目前我正在使用带有 Popen 的子进程模块。理想情况下,我会简单地使用 wait() 方法来等待安装完成执行,但是,记录的命令实际上会产生子进程来处理实际安装。下面是一些失败代码的示例代码:
import subprocess
OUI_DATABASE_10GR2_SUBPROCESS = ['sudo',
'-u',
'oracle',
os.path.join(DATABASE_10GR2_TMP_PATH,
'database',
'runInstaller'),
'-ignoreSysPrereqs',
'-silent',
'-noconfig',
'-responseFile '+ORACLE_DATABASE_10GR2_SILENT_RESPONSE]
oracle_subprocess = subprocess.Popen(OUI_DATABASE_10GR2_SUBPROCESS)
oracle_subprocess.wait()
这里有一个类似的问题:Killing a subprocess including its children from python,但是选择的答案并没有解决儿童问题,而是指示用户直接调用应用程序等待。我正在寻找一个特定的解决方案,它将等待子进程的所有子进程。如果有未知数量的子流程怎么办?我将选择解决等待所有子子流程完成问题的答案。
更清楚地说明失败:子进程在 wait() 命令之后继续执行,因为该命令只等待顶级进程(在本例中为“sudo”)。这是此问题中已知子进程的简单图: Python 子进程模块 -> Sudo -> runInstaller -> java -> (未知)
【问题讨论】:
-
我只是在问题的底部添加了更多的清晰度。
-
你能阻止oracle产生子进程吗?
-
不,我不明白oracle安装程序的流程。我正在寻找一个可以应用于任何进程子生成问题的通用答案。
-
sudo 应该等待它的子进程完成。 runInstaller 不等待它的孩子吗?这对我来说似乎很奇怪。如果属实,那么您无能为力(至少在 Unix 风格的操作系统上)。孤立进程的父进程将成为 init 进程(pid 1)。
-
我认为 sudo 正在等待其直接子进程完成(一个名为 runInstaller 的 bash 脚本),但该子进程正在调用 java.util. runInstaller 脚本不会等待 java 完成执行,而是在所有子进程完成之前完成。
标签: python oracle10g subprocess child-process spawning