python - 使用 (wx)python 记录外部程序的输出

标签 python oracle wxpython sqlplus

我正在编写一个 GUI,用于使用 oracle exp/imp 命令并通过 sqlplus 启动 sql 脚本。子进程类可以轻松启动命令,但我需要一些额外的功能。我想在使用我的 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 的输出,但只有在命令完成之后,这对我来说毫无值(value),因为我需要在这些可能长时间运行的操作中频繁更新。而 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 的全部功能。

最佳答案

解决方案是为您的命令使用一个列表

command = ["exp", "userid=user/pwd@nsn", "file=dump.dmp"]
process = subprocess.Popen(command, stdout=subprocess.PIPE)

然后您逐行读取 process.stdout:

line = process.stdout.readline()

这样您就可以无需等待就可以更新 GUI。 IF 您正在运行的子进程 (exp) 刷新输出。有可能输出被缓冲了,那么在输出缓冲区满之前你将看不到任何东西。如果是这种情况,那么您可能就不走运了。

关于python - 使用 (wx)python 记录外部程序的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/531708/

相关文章:

python - 如何从 python GUI (IDLE) 检查 wxPython 版本?

python - 使用子进程写入标准输入

sql - 使用sql Developer从oracle读取xml标签值

sql - 有没有更好的方法从 Oracle 表中检索随机行?

oracle - 当 PL/SQL 编译失败时如何让 SQL*Plus 退出

wxpython - 如何使用wxpython绘制垂直线

.net - 从 .NET 使用 Python COM 服务器

Python 和西里尔字母表

python - Django 在查询集中查找项目并获取下一个

python - Python Twisted 可以与 wxPython 一起使用吗?