Я пишу графический интерфейс для использования команд oracle exp/imp и запуска sql-скриптов через sqlplus. Класс подпроцесса упрощает запуск команд, но мне нужна дополнительная функциональность. Я хочу избавиться от командной строки при использовании моего графического интерфейса wxPython, но мне все еще нужен способ показать вывод команд 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 из этого ответа также не работает: могу ли я перехватить все исключения из приложения wxPython?
Любая помощь будет оценена по достоинству!
EDIT:
Кажется, что подпроцессы не очищают свой вывод. Я уже пробовал это с .readline().
Мой инструмент должен работать в Windows и Unix, поэтому pexpect не является решением, если нет версии для Windows. И использование cx_oracle было бы излишним, так как мне пришлось бы перестраивать всю функциональность exp, imp и sqlplus.