2

私は現在、自宅の PC を制御するための小さな python スクリプトに取り組んでいます (実際には趣味のプロジェクトであり、深刻なことではありません)。

スクリプト内では、次のように、thread を使用して同時に実行される 2 つのスレッドがあります (代わりにスレッドの使用を開始する場合があります)。

thread.start_new_thread( Function, (Args) )

スクリプトをテストするときに意図したとおりに機能します...しかし、Pyinstallerを使用してコードをコンパイルした後、2つのプロセスがあります(各スレッドに1つ-私は思います)。

これを修正するにはどうすればよいですか?

4

2 に答える 2

3

本当に気になる場合は、メインプログラムからローダーを強制終了してください。これを行う1つの方法を次に示します。

import os
import win32com.client

proc_name = 'MyProgram.exe'
my_pid = os.getpid()

wmi = win32com.client.GetObject('winmgmts:')
all_procs = wmi.InstancesOf('Win32_Process')

for proc in all_procs:
   if proc.Properties_("Name").Value == proc_name:
        proc_pid = proc.Properties_("ProcessID").Value
        if proc_pid != my_pid:
            print "killed my loader %s\n" % (proc_pid)
            os.kill(proc_pid, 9)
于 2013-06-29T17:21:05.133 に答える
-1

Python コードは「pyinstaller でコンパイル」する必要はありません

「Pyinstaller」や「py2exe」などの製品は、単一の実行可能ファイルを作成してサードパーティに配布したり、Python のインストールを気にせずにコンピューター内に再配置したりするのに役立ちますが、「速度」は向上せず、結果のバイナリも作成されません元の .py (または Windows では .pyw) ファイルよりも「完成した」ファイルです。

これらの製品が行うことは、Python itnrepreter の別のコピーを作成し、プログラムが使用するすべてのモジュールと合わせて、単一のファイル内にパックすることです。Pyinstaller は、メイン スクリプトの内容をチェックするために 2 番目のプロセスを実行し続ける可能性があります (起動など、スクリプトを実行し続けるためのオプションがある可能性があります)。これは、標準の Python プログラムの一部ではありません。

互換性の問題を引き起こす可能性があるため、Pyinstaller がスレッドを 2 つの別個のプロセスに分割する可能性は低いです。スレッドは同じプロセスで実行され、同じデータ構造に透過的にアクセスできます。

「標準的な」Python プログラムの実行方法: OS から見たメイン プロセスは Python バイナリ (Windows では Python.exe) です - 呼び出された Python スクリプトを見つけます - そのための「.pyc」ファイルがある場合、それが読み込まれます-そうでない場合は、「.py」ファイルを読み込み、それをPythonバイトコードにコンパイルします(windwos実行可能ファイルにはなりません)。このコンパイルは、プログラムを実行している人々にとって信頼できるものであり、透過的です。これは、.java ファイルから .class への Java コンパイルに似ていますが、プログラマーやユーザーが必要とする明示的な手順はありません。その場で行われます。また、Python が結果のバイトコードを .pyc として保存するかどうかは、他の要因によって制御されます。ファイルかどうか。

要約すると、Pyinstaller または他の製品で .exe ファイルを生成する代わりに、".py" スクリプトを直接実行しても、パフォーマンスへの影響はありません。ただし、スクリプトごとに Python インタープリターとライブラリーのコピーが 1 つあるため、ディスク容量の使用に影響があります。

コメントで Janne Karila が指摘した URL はそれを釘付けにします - 私が思っていたよりもさらに悪い: yioru スクリプトを実行するために、pyinstaller は Python DLL とモジュールを一時ディレクトリにアンパックします。これを実行するために必要な時間とシステム リソースは、単一のスクリプトを実行する場合と比べて取るに足らないものです。 http://www.pyinstaller.org/export/v2.0/project/doc/Manual.html?format=raw#how-one-file-mode-works

于 2013-01-25T12:32:32.710 に答える