私の父は、特にマシンに ping を実行する必要があるプログラムに取り組んでいます。これはマルチスレッドであり、必要に応じてスレッドのいずれかから呼び出される ping メソッドを作成しました。
def ping_cmd(ip):
if hasattr(sys.stderr, "fileno"):
nstderr = sys.stderr
elif hasattr(sys.stderr, "_file") and hasattr(sys.stderr._file, "fileno"):
nstderr = sys.stderr._file
else:
nstderrPath = "nul"
nstderr = file(nstderrPath, "a")
p = subprocess.Popen("ping -n 1 %s" % ip,
stdout=subprocess.PIPE,
stderr=nstderr,
stdin=subprocess.PIPE,
shell=True
)
result = p.communicate()[0]
...
if-else ブロック ステートメントは、 http ://www.py2exe.org/index.cgi/Py2ExeSubprocessInteractions のアドバイスに従って記述されています。
このコードは、Python を使用してコマンド ラインから実行すると正常に動作します (彼がテストしたところ、スレッドはいくつかの ping を実行し、エラーは発生しませんでした)、私の父が必要としているのは、それを Windows 実行可能ファイルにすることです。そのため、py2exeを使用すると、次の奇妙な動作が発生します。メインスレッドが無限ループであっても、このメソッドが呼び出された後、最初にプログラムが終了します。
プロセスをバックグラウンドで簡単に実行できるため、インターフェイスがなくても GUI アプリケーションとしてコンパイルされます。これが最善の方法かどうかはわかりませんが、役立つかもしれません。
私の作業のほとんどはLinuxマシン上で行われているため、py2exeを使用したことはありませんが、py2exeでコンパイルするときに、スレッドと生成プロセスを混合するというこの組み合わせに関係があるようです。
コードをコンパイルするための py2exe 固有のオプション:
setup(
options = {"py2exe": {"compressed": 1,
"optimize": 2,
"ascii": 1,
"bundle_files": 1,
"includes": ["encodings", "encodings.*"],
"packages": ["encodings"]}},
zipfile = None,
name = "Monit",
windows = ['Monit.py'],
)