2016-05-13 25 views
1

Ich benutze Python 3.4.2 mit Cx_freeze 4.3.4 (alle 64 Bit) das Programm, das ich erstellt hat, funktioniert gut unter Python, aber wenn eingefroren, beginnt es mir Probleme zu geben mitcx_freeze mit sys.stdout.flush() und Multiprozessing

sys.stdout.flush()
Attribute: ‚TypeNone‘ Objekt nicht attribute'flush‘

mit Methoden empfohlen hier hat, habe ich es geschafft, das Problem zu einer Traceback-Nachricht zu reduzieren, die auf blinkt Der Bildschirm für ein paar Sekunden vor dem Verschwinden. Wie kann ich dieses Problem beheben? Windows Error Screen shot

Die stdout.flush nur aufgerufen wird, wenn es den BREAK Befehl im Multiprozessing Abschnitt des Codes entspricht. Vorschläge, den Fehler entweder zu meiner Protokolldatei zu unterdrücken/umzuleiten oder die Ursache des Problems zu lösen, wären sehr willkommen.

Karl

class vDiags(tk.Tk): 
    def __init__(self, *args, **kwargs): 
     tk.Tk.__init__(self, *args, **kwargs) 
     tk.Tk.wm_title(self, "Diagnostics") 
     do stuff ............ 
     start_job() 

def pinger(job_q, mdic, ping, result_q): 
    devnull = open(os.devnull, 'w') 
    logger.info("Starting Pinger") 
    while True: 
     ip = job_q.get() 
     if ip is None: 
      logger.info("No IP address, finishing early") 
      break 
     test_result = {} 
     try: 
      if is_valid_ipv4_address(ip) is True: 
       do more stuff......... 

def start_job(): 
    logger.info("Starting start_Job") 
    pool_size = Variables.poll_size 
    logger.info("Pool size %s" % pool_size) 
    jobs = multiprocessing.Queue() 
    logger.info("Jobs %s" % jobs) 
    results = multiprocessing.Queue() 
    logger.info("results %s" % results) 
    manager = multiprocessing.Manager() 
    logger.info("manager %s" % manager) 
    manager_test_dict = manager.dict() 
    logger.info("manager_test_dict %s" % manager_test_dict) 
    for key, val in Variables.test_dic.items(): 
     manager_test_dict[key] = val 
    pool = [multiprocessing.Process(target=pinger, args=(jobs, manager_test_dict, Variables.ping, results)) 
      for i in range(pool_size) 
      ] 
    for p in pool: 
     logger.info("p in pool %s" % p) 
     p.start() 
    for i in Variables.source_ip: 
     logger.info("Source IP:> %s" % i) 
     jobs.put(i) 
    for p in pool: 
     logger.info("p in pool (jobs) %s" % p) 
     jobs.put(None) 
    for p in pool: 
     logger.info("p in pool (join) %s" % p) 
     p.join() 
    logger.info("Move Results to new Variable") 
    logger.info(results.qsize()) 
    while not results.empty(): 
     Variables.test_result_raw = updatetree(Variables.test_result_raw, results.get()) 
    logger.info("Finished start_Job") 


class fakestd(object): 
    def write(self, string): 
     logger.info("write %s" %string) 
     pass 

    def flush(self): 
     logger.info("Flush %s " % self) 
     pass 

if __name__ == '__main__': 
    # ********** Main App ********** 
    sys.stdout = fakestd() 
    sys.stderr = fakestd() 
    multiprocessing.freeze_support() 
    logger.info("tkinter Installed Version %s" % tk.TkVersion) 
    app = vDiags() 
    app.geometry("1280x720") 
    app.mainloop() 
# ********** Main App ********** 

Antwort

0

ich jetzt dieses Problem bin schlagen (migriert nur zu Multiprocessing von Threading) Es scheint es ein fragwürdiger Fehler im Multiprocessing-Modul ist & die multiprocessing.freeze_support (Call).

https://bugs.python.org/issue20607 Es gibt Berichte, dass es immer noch in py35 vorhanden ist, aber eine Chance besteht, auf der py-Quellenebene behoben zu werden.

Aus py34 Sicht der ONE-Datei Ich war zu aktualisieren benötigt:

C: \ Python34 \ Lib \ Multiprozessing \ process.py

diff -u process_orig.py process.py 
--- process_orig.py  2016-12-12 12:42:01.568186800 +0000 
+++ process.py 2016-12-12 12:37:28.971929900 +0000 
@@ -270,8 +270,14 @@ 
      traceback.print_exc() 
     finally: 
      util.info('process exiting with exitcode %d' % exitcode) 
-   sys.stdout.flush() 
-   sys.stderr.flush() 
+# ---------- JRB modify 
+   #sys.stdout.flush() # jrb edit to fix cx_freeze 
+   #sys.stderr.flush() # jrb edit to fix cx_freeze 
+   if sys.stdout is not None: 
+    sys.stdout.flush() 
+   if sys.stderr is not None: 
+    sys.stderr.flush() 
+# ---------- JRB modify 

     return exitcode 
Verwandte Themen