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

Я пишу программу GUI с помощью 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 intepreter, т.е. если это запускается с командной строки "Python myapp.py".

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

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

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

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

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

16
задан Bing Jian 15 January 2010 в 19:35
поделиться

2 ответа

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

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

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

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

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

26
ответ дан 30 November 2019 в 21:28
поделиться

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

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

0
ответ дан 30 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: