2015-11-23 5 views
1

Я хочу запустить простой HTTP-сервер из графического интерфейса (wxPython) с помощью многопроцессорности модуля.PyInstaller и многопроцессорность

Этот код отлично работает, если я начинаю его непосредственно с Python. Но в построенной версии (с PyInstaller 2 или 3) GUI запускается снова, если я запускаю мультипрограмму -> не код в функции запуска, всего приложения. У кого-нибудь есть идея, почему?

#!/usr/bin/env python 
# -*- coding: UTF-8 -*- 

import wx, sys, time, thread, datetime, os, platform, multiprocessing, socket 
import favicon 
from genLicense import load as loadLicense 
from licenseDetailDialog import Dialog as licenseDetailDialog 

class mp(multiprocessing.Process): 
    def __init__(self, queue, func, *args): 
     multiprocessing.Process.__init__(self) 
     self.queue = queue 
     self.func = func 
     self.args = args 
    def run(self): 
     time.sleep(0.1) 
     try: 
      self.func(*self.args) 
     except Exception as e: 
      self.queue.put(e) 
      print(e) 

class MainFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     kwds["style"] = wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER 
     wx.Frame.__init__(self, *args, **kwds) 

     # [...] 

     self.button_startstop = wx.Button(self, wx.ID_ANY, _("Server &starten")) 

     # [...] 

    def startstop(self, event): 
     if self.running: 
      self._stop() 
     else: 
      self._start() 

    def _start(self): 
     print("Starting...") 

     try: 
      port = 123 
      queue = multiprocessing.Queue() 

      self.server_process = mp(queue, ACC_main.START, port) 
      self.server_process.start() 
      print("\tPID: {}\n\n{}".format(self.server_process.pid, "="*50)) 

      # [...] 

      self.running = True 

     except: 
      # [...] 


    def _stop(self): 
     print("\n{}\nStopping...".format("="*50)) 

     if self.running: 
      print("\tPID: {}\n".format(self.server_process.pid)) 
      self.server_process.terminate() 
     self.running = False 

ответ

1

Добавьте строку multiprocessing.freeze_support() в код перед созданием окна. Документировано here

Смежные вопросы