Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 23, 2013 13:00:52

nmh
Зарегистрирован: 2012-07-25
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

twisted, ProcessProtocol, stdout

Всем привет.
Не могу разобраться в том, как получать данные из дочернего процесса с помощью Twisted (в том случае, если дочерним процессом является другой python-скрипт).
При этом через popen все работает.

Неработающий пример:
Скрипт 1:

# -*- coding: UTF-8 -*-
from twisted.internet import reactor,protocol
def runtest2():
	class test2Protocol(protocol.ProcessProtocol):
		def connectionMade(self):
			print u"Запущен процесс test2"
		def outReceived(self,data):
			print u"Получены данные %s" % data 
		def processEnded(self,reason):
			print u"Процесс импорта данных был непредвиденно завершен."
	reactor.spawnProcess(test2Protocol(),"C:\\Python27\\python.exe",["test2.py"])
if __name__ == "__main__":
	reactor.callWhenRunning(runtest2)
	reactor.run()
Скрипт 2:
# -*- coding: UTF-8 -*-
from twisted.internet import reactor
import os,sys
sys.stdout.flush()
def main():
	print "test"
	sys.stdout.write("test1\n")
	os.write(1,"test2")
main()

Работающий пример скрипта №1:
# -*- coding: UTF-8 -*-
from subprocess import Popen, PIPE
out, err = Popen("C:\\Python27\\python.exe test2.py", shell=True, stdout=PIPE).communicate()
print out

Проблема в том, что мне хотелось бы использовать имено twisted, т.к. необходимо мониторить выхлоп второго скрипта в течение довольно продолжительного времени (ну и в программе я использую много других возможностей twisted).

Платформа windows 8, питон 2.7

П.С. Забыл упомянуть одну вещь. Если субпроцессом является какая-либо сторонняя программа, то все работает и все сообщения перехватываются, проблема только, если в дочернем процессе запускается python.

Отредактировано nmh (Сен. 23, 2013 13:07:36)

Офлайн

#2 Сен. 23, 2013 13:34:39

nmh
Зарегистрирован: 2012-07-25
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

twisted, ProcessProtocol, stdout

Все заработало, как надо, когда я добавил аргумент -u.

reactor.spawnProcess(test2Protocol(),"C:\\Python27\\python.exe",["-u","test2.py"])

Офлайн

#3 Сен. 23, 2013 14:55:34

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

twisted, ProcessProtocol, stdout

Аргументы должны включать название программы:

reactor.spawnProcess(test2Protocol(),"C:\\Python27\\python.exe",["C:\\Python27\\python.exe", "test2.py"])



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version