2016-05-13 18 views
1

私はcx_freeze 4.3.4(全64ビット)でpython 3.4.2を使用しています 私が作成したプログラムはPythonでうまく動作しますが、フリーズすると問題が起こり始めますcx_freeze sys.stdout.flush()とマルチプロセッシングを使用

sys.stdout.flush()
はAttributeErrorで:「TypeNone」オブジェクトは、ここに推奨する方法を使用して

「attribute'flushしていない、私は上の点滅するトレースバックメッセージに問題を軽減するために管理しています数秒間画面が消えてから消えます。どうすればこの問題を解決できますか?それは、コードのマルチセクションにBREAKコマンドを満たしたときstdout.flushのみ呼び出され Windows Error Screen shot

。 エラーを私のログファイルに抑制/リダイレクトするか、問題の原因を解決するのに役立つ提案をいただければ幸いです。私は今この問題に当たっています

カール

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 ********** 

答えて

0

(単にスレッドからマルチプロセッシングに移行) マルチプロセッシングモジュール&でmultiprocessing.freeze_support()の呼び出し疑問バグで表示されます。

https://bugs.python.org/issue20607 py35にはまだ報告がありますが、pyソースレベルで修正される可能性があります。

ビューのpy34の観点から、私が更新するのに必要な1つのファイルがあった。

C:\ Python34 \ Libの\マルチプロセッシングの\ 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 
関連する問題