2010-01-15 7 views
16

Я пишу программу GUI, используя PyQt4. В главном окне есть кнопка. Надеюсь запустить фоновый процесс , который является экземпляром класса, полученного , из обработки. Процесс.проблема многопроцессорности [pyqt, py2exe]

class BackgroundTask(processing.Process): 
    def __init__(self, input): 
     processing.Process.__init__(self) 
     ... 

    def run(self): 
     ... 

(Обратите внимание, что я использую порт python2.5 из питона многопроцессорной полученного из http://code.google.com/p/python-multiprocessing/ , поэтому это processing.Process вместо multiprocessing.Process. Я думаю, это должно нет разницы. Правильно ли я?)

Этот код связан с кнопкой мыши сигнал что-то просто, как

processing.freezeSupport() 
task = BackgroundTask(input) 
task.start() 

Программа работает так, как ожидалось, под встроенным интерпретатором python, то есть , если она запущена из командной строки «python myapp.py».

Однако, после того, как я упаковать программу, используя py2exe, каждый раз, когда я нажимаю на эту кнопку, вместо начать фоновую задачу, копия главного окна выскочит. Я не уверен , в чем причина такого поведения. Я думаю это связано со следующей запиской на имя в http://docs.python.org/library/multiprocessing.html#multiprocessing-programming

«Функциональность в рамках этого пакета требует, чтобы главный метод быть ввозу детьми. Об этом рассказывается в руководствах по программированию, однако стоит отметить здесь . Это означает, что некоторые примеры, такие как примеры multiprocessing.Pool не будет работать в интерактивном интерпретаторе «

Единственное место, где я есть, если имя ==» главный "в главном модулекак в типичной PyQt программы

if __name__ == "__main__": 
    a = QApplication(sys.argv) 
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()")) 
    w = MainWindow() 
    w.show() 
    a.exec_() 

Любые решения о том, как решить эту проблему? Благодаря!

+0

Можете ли вы пояснить: защитили ли вы основной модуль, как описано в документах многопроцессорности? или у вас нет доступа к основному модулю (я не знаю, как работает pyqt)? также стоит проверить, что вы используете последнюю версию py2exe. У меня были проблемы в прошлом, которые, как оказалось, были вызваны устаревшими py2app/py2exe – James

+0

Спасибо за комментарий. Я просто добавил часть __name__ == "__main__" в свой пост. Не уверен, защищаю ли я основной модуль или нет. Последняя версия py2exe, найденная мной из http://sourceforge.net/projects/py2exe/files/, была выпущена в 2008-11-16, поэтому я думаю, что использую последнюю версию py2exe. –

ответ

26

Я думаю, что фактическая проблема связана с этим:

Программа работает как ожидается, под питоном intepreter, то есть, если он запускается из командной строки «питон myapp.py».

Однако после того, как я упакую программу, используя py2exe, каждый раз, когда я нажимаю эту кнопку,> вместо запуска фоновой задачи появляется копия главного окна.

Вам нужно добавить специальный вызов функции freeze_support(), чтобы сделать модуль работы многопроцессорной с «замороженными» исполняемых файлов (например, те, сделаны с py2exe):

if __name__ == "__main__": 
    # add freeze support 
    processing.freeze_support() 
    a = QApplication(sys.argv) 
    QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()")) 
    w = MainWindow() 
    w.show() 
    a.exec_() 

Ссылка: http://docs.python.org/library/multiprocessing.html#multiprocessing.freeze_support

+1

+1: Раньше в ту же самую проблему некоторое время назад использовалось то же самое исправление. –

+1

Большое спасибо. Оно работает! Я знал об этой функции freeze_support(), но я не поместил ее в нужное место. Вместо того, чтобы ставить его перед a = QApplication (sys.argv), я помещаю его каждый раз перед созданием нового экземпляра процесса, который, похоже, не работает. –

0

«Функциональность в этом пакете требует, чтобы основной метод был импортирован детьми».

Я думаю, это означает, что вы должны иметь функцию main(), определенную где-то.

0

Вопрос касательно Python 2 и был решен. Для Python 3 это будет выглядеть так:

from multiprocessing import freeze_support 

if __name__ == '__main__': 
    freeze_support() 

    a = QApplication(sys.argv) 
    ... 
Смежные вопросы