だから私はPythonで音楽プレーヤーに取り組んでおり、メインウィンドウを初期化すると、ファイルからメタデータを取得するはずのスレッドが開始されます。しかし代わりに、mutagens File 関数の最初のインポート呼び出しで停止します。
スクリプトを python.exe で直接実行すると、問題なく動作します。しかし、C++ でネイティブ python API を使用してスクリプトを開始すると、関数を呼び出すスレッドがフリーズします。ただし、問題なくメインスレッドから関数を呼び出すことができます。
main.cpp:
_putenv_s("PYTHONPATH", "python32.zip");
Py_Initialize();
PyRun_SimpleString("import cmw");
Py_Finalize();
cmw.py:
import meta
class MW(QtGui.QMainWindow):
def __init__(self):
super().__init__(None)
...
self.m = meta.Meta()
self.m.get(lists_of_files)
meta.py:
import mutagen
class Meta:
def __init__(self):
self.q = Queue()
self.lock = Lock()
self.result = []
def get(self, files):
t = Thread(target=self._work)
t.daemon = True
t.start()
for f in files:
self.q.put(f)
def _work(self):
while True:
f = self.q.get()
print(1)
meta = mutagen.File(f)
with self.lock:
self.result.append(meta)
self.q.task_done()
print("Done")
変異原init .py:
def File(filename, options=None, easy=False):
print(2)
if options is None:
from mutagen.asf import ASF
... imports lots of files ...
print(5)
変異原 asf.py:
print(3)
... All the code ...
print(4)
出力:
1
2
プログラムの残りの部分は問題なく動作します。例外も何もありません。そして、スクリプトが終了すると
3
4
5
編集:main.cpp で import を exec(open().read()) に変更して修正しました。