Подтвердить что ты не робот

Многопроцессорная проблема [pyqt, py2exe]

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

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.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_()

Какие-нибудь решения по устранению этой проблемы? Спасибо!

4b9b3361

Ответ 1

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

Программа работает так, как ожидалось, при запуске 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

Ответ 2

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

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

Ответ 3

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

from multiprocessing import freeze_support

if __name__ == '__main__':
    freeze_support()

    a = QApplication(sys.argv)
    ...