Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Нужна помощь касательно Python,Subprocess,PyQt4 [RSS Feed]

#1 Сен. 1, 2010 06:32:18

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Нужна помощь касательно Python,Subprocess,PyQt4

Делаю некое приложение состоящее из основного окна и QTabWidget в котором каждый tab это клас на основе QTextEdit.
Суть в запуске этим приложением дочерних *.exe и *.py файлов и перенаправлением вывода в свой тектсовой виджет.

WinXp,Python 2.6.2.

столкнулся со следующими проблемами: (в коде указаны комментариями #FIXME:)
1) считывание вывода получается в случае с *.exe файлами происходит кусками, в случае с *.py скриптами вывод вообще не происходит.(в обоих случаях это простой ежесекудный вывод строк на станд.уст.вывода)
Стоит отметить что если в *.py скрипте заменить print some на sys.stdout.write(some);sys.stdout.flush(); то все будет работать как надо.

2)В случае с *.exe текст в текстовом виджете прорисовывается кусками (до тех пор пока его не выделишь). Метод repaint() не помог.
возможно с этим связанно сообщение интерпретатора:
QObject::connect: Cannot queue arguments of type ‘QTextCursor’
(Make sure ‘QTextCursor’ is registered using qRegisterMetaType().)

3)При закрытии приложения нужно закрыть все запущенные процессы. Однако на практике получается закрыть только последний запущенный, в остальных случаях вылазиет ошибка WinError 5.

Прошу помогите мне во всем разобраться и исправить ошибки.

Основной код:

#-*- coding: cp1251 -*-

ru=lambda x: unicode(x)

import time,sys,thread,subprocess,os
from PyQt4.QtGui import *
from PyQt4.QtCore import *

class MyText(QTextEdit):
def __init__(self,paramStr):
super(MyText,self).__init__()

thread.start_new_thread(self.lookIt,(paramStr,))

def lookIt(self,paramStr):
self.childProcess=subprocess.Popen(paramStr,stdout=subprocess.PIPE)
while True:
str=self.childProcess.stdout.readline() #FIXME: 1
if not str:
print 'break happen on pid',self.childProcess.pid
break
self.append(unicode(str.rstrip())) #FIXME: 2

class Main(QMainWindow):
def __init__(self):
super(Main,self).__init__()

self.tab=QTabWidget(self)
self.tab.setTabsClosable(True)
self.connect(self.tab, SIGNAL('tabCloseRequested(int)'),self.tabClose)

self.sb=self.statusBar()
self.sb.showMessage('start',1000)

self.actionOpen=QAction(ru('Открыть'),self)
self.connect(self.actionOpen, SIGNAL('triggered()'),self.actionLaunch)

self.menu=self.menuBar()
self.menu.addAction(self.actionOpen)

self.setCentralWidget(self.tab)
self.setGeometry(150,150,640,480)

def actionLaunch(self):
#TODO: выбор файла
i=self.tab.addTab(MyText('python one.py'), 'python - one.py')
self.tab.setCurrentIndex(i)

def tabClose(self,index):
try:
if self.tab.currentWidget().childProcess.poll()==None:
self.tab.currentWidget().childProcess.terminate() #FIXME: 3
self.tab.removeTab(index)
except Exception,e: # на всякий случай так
print sys.exc_info(),'\n',e

def closeEvent(self,QCloseEvent):
for tabIndex in xrange(self.tab.count()):
self.tabClose(0)
QCloseEvent.accept()



app=QApplication(sys.argv)
form=Main()
form.show()
app.exec_()
Код вызываемого скрипта one.py:
import time,sys

print '\nStart'
i=0
while True:
i+=1
print i
time.sleep(1)
print 'End'



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#2 Сен. 1, 2010 16:22:32

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Нужна помощь касательно Python,Subprocess,PyQt4

по поводу 1) *.py
из соседней ветки выяснено, что нужно интерпретатор питона вызывать с ключом -i



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Сен. 6, 2010 13:56:26

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Нужна помощь касательно Python,Subprocess,PyQt4

методом случайного тыка решил проблему 3):

self.tabClose(self.tab.currentIndex())



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

  • Начало
  • » GUI
  • » Нужна помощь касательно Python,Subprocess,PyQt4[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version