実際、この問題は巨大なシステムの深刻なバグであり、問題を次のコードスニペットに単純化しています。我々は、スレッドの動作が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の作成者がバグを修正し、私たちの質問に完全な解決策を提供できることを願っています。