我正在编写一个用于使用 oracle exp/imp 命令并通过 sqlplus 启动 sql-scripts 的 GUI。subprocess 类使启动命令变得容易,但我需要一些额外的功能。我想在使用我的 wxPython GUI 时摆脱命令提示符,但我仍然需要一种方法来显示 exp/imp 命令的输出。
我已经尝试过这两种方法:
command = "exp userid=user/pwd@nsn file=dump.dmp"
process = subprocess.Popen(command, stdout=subprocess.PIPE)
output = process.communicate()[0]
process = subprocess.Popen(command, stdout=subprocess.PIPE)
process.wait()
output = process.stdout.read()
通过其中一种方法(忘了哪一种),我确实得到了 exp/imp 的输出,但只有在命令完成之后,这对我来说毫无价值,因为在这些可能长时间运行的操作期间我需要经常更新。并且 sqlplus 提出了更多问题,因为 sqlplus 在发生错误时主要需要一些输入。当发生这种情况时,python 等待进程完成但用户看不到提示,所以你不知道要等待多长时间或做什么......
我想要的是一个包装器,它输出我在标准命令行上可以看到的所有内容。我想将它记录到一个文件中并在 wxPython 控件中显示它。
我还尝试了此页面中的代码: http: //code.activestate.com/recipes/440554/ 但这也无法读取输出。此答案中的 OutputWrapper 也不起作用:How can I capture all exceptions from a wxPython application?
任何帮助,将不胜感激!
编辑:
子进程似乎没有刷新它们的输出。我已经用 .readline() 试过了。
我的工具必须在 windows 和 unix 上运行,所以如果没有 windows 版本,pexpect 是没有解决方案的。并且使用 cx_oracle 将是极端的矫枉过正,因为我将不得不重建 exp、imp 和 sqlplus 的整个功能。