Многопроцессорная проблема [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_()
Какие-нибудь решения по устранению этой проблемы? Спасибо!
Ответы
Ответ 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)
...