我正在编写一个 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 的输出,但只有在命令完成之后,这对我来说毫无价值,因为我需要在这些可能长时间运行的操作期间频繁更新。 sqlplus 带来了更多问题,因为 sqlplus 在发生错误时大多需要一些输入。当这种情况发生时,python 会等待进程完成,但用户看不到提示,所以你不知道要等待多长时间或做什么......
我想要的是一个包装器,它输出我在标准命令行上可以看到的所有内容。我想将其记录到一个文件中并在 wxPython 控件中显示它。
我还尝试了此页面中的代码:http://code.activestate.com/recipes/440554/ http://code.activestate.com/recipes/440554/但这也无法读取输出。
此答案中的 OutputWrapper 也不起作用:如何捕获 wxPython 应用程序中的所有异常? https://stackoverflow.com/questions/166198/how-can-i-capture-all-exceptions-from-a-wxpython-application
任何帮助,将不胜感激!
EDIT:
子进程似乎没有刷新它们的输出。我已经用 .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)刷新输出。输出可能被缓冲,那么在输出缓冲区已满之前您将看不到任何内容。如果是这样的话,那么你可能就不走运了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)