проблема многопроцессорности [pyqt, py2exe] - PullRequest
16 голосов
/ 15 января 2010

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

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

    def run(self):
        ...

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

Код, связанный с сигналом нажатия кнопки это что-то вроде

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

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

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

"Функциональность в этом пакете требует, чтобы метод main был импортирован детьми. Это описано в Руководстве по программированию, однако на это стоит обратить внимание. Это означает, что некоторые примеры, такие как многопроцессорная обработка. Примеры пулов не будут работать в интерактивном переводчике «

Единственное место, которое у меня есть, если name == " main " находится в главном модуле как в типичной программе pyqt

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

Есть какие-нибудь решения, как решить эту проблему? Спасибо!

Ответы [ 3 ]

26 голосов
/ 04 февраля 2010

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

Программа работает должным образом в интерпретаторе python, т.е. если она запускается из командной строки "python 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

0 голосов
/ 28 декабря 2017

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

from multiprocessing import freeze_support

if __name__ == '__main__':
    freeze_support()

    a = QApplication(sys.argv)
    ...
0 голосов
/ 29 января 2010

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

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

...