2017-01-09 15 views
0

Я занимался разработкой GUI-приложения в IDA anaconda и в python 3.4 и с использованием простого тестового сценария, я думал, что он хорошо работает в пределах 3.4, отображая вывод в реальном времени и ожидая ввода. Конечной целью приложения было запустить скрипт, который я не контролирую и кодируется в версии 2.7, и отправляю команды сценария. Я преобразовал достаточно скрипта gui для работы в версии 2.7, но qprocess не работает должным образом. С помощью простого тестового сценария ничего не отображается, предполагая, что он висит в raw_input. Когда я запускаю нужный сценарий, ничего не отображается, тогда все отображается с сообщением о его выключении (возможно, функция тайм-аута не может проверить). К сожалению, я не могу опубликовать фактический скрипт, но я сварил код до этого простого тестового примера, который не работает для меня. Я думаю, что проблема не в том, что чтение сценария в режиме реального времени и процесс должным образом не ожидает ввода. Как я могу заставить это работать в 2,7?запуск скрипта в gui с qprocess работает в 3.4, не 2.7, зависающем на raw_input?

mainwindow.ui:

<?xml version="1.0" encoding="UTF-8"?> 
<ui version="4.0"> 
<class>MainWindow</class> 
<widget class="QMainWindow" name="MainWindow"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>562</width> 
    <height>608</height> 
    </rect> 
    </property> 
    <property name="windowTitle"> 
    <string>MainWindow</string> 
    </property> 
    <widget class="QWidget" name="centralWidget"> 
    <layout class="QVBoxLayout" name="verticalLayout"> 
    <item> 
    <layout class="QHBoxLayout" name="horizontalLayout"> 
     <item> 
     <widget class="QLineEdit" name="fileLocation"/> 
     </item> 
     <item> 
     <widget class="QPushButton" name="openFileButton"> 
     <property name="text"> 
     <string>OpenFile</string> 
     </property> 
     </widget> 
     </item> 
     <item> 
     <widget class="QPushButton" name="startButton"> 
     <property name="text"> 
     <string>Start</string> 
     </property> 
     </widget> 
     </item> 
    </layout> 
    </item> 
    <item> 
    <widget class="QTextBrowser" name="textBrowser"/> 
    </item> 
    </layout> 
    </widget> 
    <widget class="QMenuBar" name="menuBar"> 
    <property name="geometry"> 
    <rect> 
    <x>0</x> 
    <y>0</y> 
    <width>562</width> 
    <height>21</height> 
    </rect> 
    </property> 
    </widget> 
    <widget class="QToolBar" name="mainToolBar"> 
    <attribute name="toolBarArea"> 
    <enum>TopToolBarArea</enum> 
    </attribute> 
    <attribute name="toolBarBreak"> 
    <bool>false</bool> 
    </attribute> 
    </widget> 
    <widget class="QStatusBar" name="statusBar"/> 
</widget> 
<layoutdefault spacing="6" margin="11"/> 
<resources/> 
<connections/> 
</ui> 

main.py:

from PyQt4 import QtCore, QtGui, uic 

class MyMainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QMainWindow.__init__(self, parent) 
     uic.loadUi('mainwindow.ui', self) 
     self.openFileButton.clicked.connect(self.getFname) 
     self.process=QtCore.QProcess(self) 
     self.process.readyRead.connect(self.dataReady) 
     self.startButton.clicked.connect(self.startScript) 

    def getFname (self): 
     self.fileLocation.setText(QtGui.QFileDialog.getOpenFileName(self, "Save File", "", "*.py ;; All files *.*")) 

    def dataReady(self): 
     self.textBrowser.append(bytearray(self.process.readAllStandardOutput()).decode('utf-8')) 

    def startScript(self): 
     self.process.start('python',[self.fileLocation.text()]) 

if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    main_window = MyMainWindow() 
    main_window.show() 
    sys.exit(app.exec_()) 

test.py кодируются питона 2.7:

print "running script 2" 
print "Enter an input A,B,C:" 

s=raw_input("") 
print "you selected:"+s 
+0

можете ли вы опубликовать скрипт 3.4, который сработал? –

+0

да: 'печать ("бегущая сценарий 2") печать ("Введите входной A, B, C:") S = вход ("") печати ("Вы выбрали:" + s)' – kaminsknator

+0

может вы пытаетесь «print (« running script 2 ») print (« Введите вход A, B, C: ») s = str (ввод (« »)) print (« вы выбрали: «+ s») в вашем python 2.7 контрольная работа? –

ответ

0

Питон версия сценария может отличаться от GUI, потому что вы начинаете внешний процесс. Таким образом, вы можете запустить GUI в Python 3.4, а скрипт запускается в Python 2.7. Просто убедитесь, что вы указали полный путь к исполняемому файлу Python, который вы хотите использовать.

+0

Это не исправить мою проблему. – kaminsknator

+0

На 100% уверен, что это сработает, нет причин для преобразования графического интерфейса. Однако могут возникнуть другие проблемы с тем, как вы пытались реализовать то, что я описываю, или просто другие вопросы, не зависящие от вышеуказанного. Я предлагаю вам запустить 3.4 приложение для скрипта exec 3.4 и проверить его запуск; затем замените скрипт 3.4 сценарием 2.7, сохранив приложение 3.4. Если это не сработает, отправьте новый вопрос с этим кодом. – Schollii

+0

Даже этот простой тестовый код, показанный выше с основным скриптом, выполнялся в версии 3.4, а тестовый запущенный подпроцесс в версии 2.7 он все равно не выводил. – kaminsknator