Я пишу программу 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_()
Какие-либо решения о том, как решить эту проблему? Спасибо!
Я думаю, что Ваша актуальная проблема связана с этим:
Программа работает, как и ожидалось, под питоновым целым, т.е. если она запускается из командной строки "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
«Функциональные возможности в пределах этого пакета требует, чтобы основной метод был импортирован детьми».
Я думаю, что это означает, что вы должны иметь основную функцию (), определенную где-то.