2017-05-16 17 views
1

実際、この問題は巨大なシステムの深刻なバグであり、問​​題を次のコードスニペットに単純化しています。我々は、スレッドの動作がPythonコードとEXEファイルで異なる理由を理解したい。QThreadブロックでは、cx_FreezeによってPythonコードがフリーズされたときにUTF-16をデコードしていますか?

コードには2つのスレッドが含まれており、2つのスレッドが同時に実行され、Windows 7(64ビット)でPython 2.7で終了すると予想されます。

CPythonをコンソールで直接使用すると、コードが正しく実行されます。たとえば、コンソールで「python tThread.py」を使用します。両方のスレッドが実行され、正常に終了します。コードはcx_Freeze 5.0.1とexeファイルに凍結されて実行されるが

、ライン= u16.decode UU(「UTF-16」)サブスレッドブロック、メインスレッドは、デッドになりつつループ。

(コンソールコマンドが "のpython setup.py build_exe -bを構築:

以下
# -*- coding: UTF-8 -*- 
import sys 
reload(sys) 
sys.setdefaultencoding('utf-8') 

import time 
from PySide import QtGui, QtCore 
from PySide.QtCore import * 
from PySide.QtGui import * 

class Worker(QObject): 
    done = QtCore.Signal() 
    def longRun(self): 
     count = 1 
     while count < 20: 
      print "Worker Thread", count 
      u16 = u"ABCD".encode("utf-16") 
      uu = u16.decode("utf-16")  # Block here <--- 
      count += 1 
     self.done.emit() 


def mainThread(): 
    app = QApplication([]) 

    objThread = QThread() 
    obj = Worker() 
    obj.moveToThread(objThread) 
    obj.done.connect(objThread.quit) 
    objThread.started.connect(obj.longRun) 
    objThread.start() 


    i = 1 
    while not objThread.isFinished(): 
     QCoreApplication.processEvents() 
     print "Main Thread", i 
     time.sleep(0.1) 
     i+=1 

    print "Main Thread Over" 

mainThread() 
sys.exit() 

がcx_Freezeためsetup.pyファイルです:

は以下tThread.pyです")

from cx_Freeze import setup, Executable 
import platform 

build_exe_options = { 
    "packages": [ "PySide"], 
    "include_msvcr": True 
}; 

exe = Executable(u".\\tThread.py", base=None, targetName="tThread.exe") 

setup( name = "tThread", 
     version = "0.1", 
     description = u"tThread", 
     options = {"build_exe": build_exe_options}, 
     executables = [exe]) 

私は、 cx_Freezeのバグは、生のコードとexeの間で異なる動作につながります。 スレッドにデコードコードを渡すための解決策を見つけるのを助けてください、ありがとう。数日間のための困難なデバッグした後、我々は$ Python27 $ \ Libの\エンコーディングでこの行のスレッドブロックを見つける


\ __

mod = __import__('encodings.' + modname, fromlist=_import_tail,level=0) 

init__.pyにcx_Freezeはランタイムモジュールのバグがあります - マルチスレッドでのインポート。


最後に、ハッキングコードを使用してブロックコードをバイパスします。たとえば、スレッドコードの外に手動でモジュールをインポートします。しかし、未来に起こるかもしれない隠れたインポートのバグがまだ残っているので、我々はそれがエレガントな解決策ではないと考える。 cx_Freezeの作成者がバグを修正し、私たちの質問に完全な解決策を提供できることを願っています。

答えて

0

cx_Freezeの著者がバグを修正し、5.0.2にアップデートしました。

関連する問題はHere

です。