0

だから私は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()) に変更して修正しました。

4

1 に答える 1

0

オッケー。他の誰かがこの問題を抱えている場合。編集を参照

于 2013-03-09T10:36:19.113 に答える