サブプロセスまたはスレッドでコードを実行することについて多くのことを見てきましたが、モジュールとモジュールを使用するmultiprocessing
とthreading
非常に簡単でした。ただし、GUI でこれを行うと、さらに複雑なレイヤーが追加されます。
私が理解していることから、複数のスレッド (またはプロセス) から GUI クラスを操作しようとすると、GUI クラスはそれを好みません。回避策は、作成したスレッドからグラフィックスを担当するスレッドにデータを送信し、そこでレンダリングすることです。
残念ながら、私が念頭に置いているシナリオでは、これはオプションではありません。私が作成した GUI を使用すると、ユーザーは独自のプロット コードを記述して実行することができます。これは、彼らがどのようにプロットするかを正確に制御できないことを意味します。また、それを望んでいません. (更新:これらのプロットは別のウィンドウに表示され、メインGUIのどこにも埋め込む必要はありません。私が望むのは、グラフィックライブラリの基礎となるスタックを共有せずに、メインGUIから分離して存在させることです。)
そこで今気になっているのは
ウィンドウシステムとの独自のつながりを持つまったく新しいインタープリターインスタンスでPythonコードの文字列を実行するクリーンな(っぽい)方法はありますか?
コメントへの応答:
現在のアプリケーションは次のように設定されています。単純な Python スクリプトが wxPython GUI (wx.App) をロードします。この GUI を使用して、ユーザーはシミュレーションをセットアップできます。その一部には、シミュレーションを実行し、結果を後処理するプレーン python でのスクリプトの作成が含まれます (通常、プロットの作成と表示が含まれます)。現時点では、スクリプト コードで exec() を呼び出すだけでこれを実行しています。これは問題なく動作しますが、シミュレーションの実行中に GUI がフリーズします。サブプロセスで埋め込みスクリプトを実行して実験しましたが、これも正常に動作し、作成したグラフを表示しようとするまで (通常は matplotlib の show() を使用) します。この時点で、複数のスレッドから操作できないため、wxPython、wx、gtk などのスタックの奥深くにあるライブラリが文句を言い始めます。希望する編成ほぼ同じですが、埋め込みスクリプトがメイン アプリケーションと GUI を共有する代わりに、独自の環境でグラフィックを表示したいと考えています。
明確にするために:
これは、「マルチスレッディング/マルチプロセッシングを行う方法」や「単一の wxpython GUI 内でマルチスレッディング/マルチプロセッシングを行う方法」についての質問ではありません。問題は、まったく新しいGUI をロードする GUIからスクリプトを開始する方法です。ウィンドウ マネージャにこのスクリプトを完全に別のアプリケーションとして認識させるにはどうすればよいですか?
最も簡単な方法は、どこかの一時フォルダーに生成してから、Python インタープリターへの非ブロック呼び出しを行うことですが、これにより通信がより困難になり、いつ一時ファイルを削除できるかを知るのが非常に難しくなります。これを行うための、よりクリーンで動的な方法があることを望んでいました。