Windows で Python 2.6 を使用して、それぞれ独自の Python スクリプトを実行するいくつかの個別のコマンド ウィンドウを起動したいと考えています。目的は: これらはクライアントであり、複数の準独立クライアントからの要求でサーバーをロードしようとしています。
実行中または実行後にクライアントと通信する必要はありませんが、それぞれに異なるコマンドライン引数を送信する必要があり、各クライアントの出力を独自の「コンソール」でスクロールしたいと考えています。
DOS コマンド ラインから、"start" コマンドを実行すると、私のやりたいことが実行されます。次のいずれかを実行できます。
start perf_test.py 2
また
start cmd /c perf_test.py 3
また
start cmd /c python perf_test.py 4
(これらは、*.py ファイルに対して「ファイルの関連付け」が正しく設定されている場合に機能します。ヘルプが必要な場合は、他のスレッドがあります。または、python exe および/またはスクリプトへのフル パスを使用してください。)
私の課題は、Python から同じ効果を得るにはどうすればよいかということです。
ライブラリを使用してsubprocess
、次のようなバリエーションを試しました。
from subprocess import *
p = Popen(["perf_test.py", "4"], shell=True, stdin=PIPE)
しかし、 を使用してもshell=True
、既に実行しているウィンドウに出力が混在しています。追加stdout=PIPE
するとそれが停止しますがp.stdout
、p.communicate()
. Popen に「cmd」を追加すると、ほぼ同じになります。
p = Popen(["cmd", "/c", "perf_test.py", "4"], shell=True, stdin=PIPE)
上記のいずれも、私が探している効果を達成しません。つまり、「このスクリプト用に新しい個別のウィンドウを開き、その出力が独自のコンソールでスクロールするのを確認します」(これらのクライアントを N 個実行したいため)並行して)。
私が注目したもう1つのことも、ほとんど機能します。
import os
os.startfile("perf_test.py")
これはすぐに戻り、実際の dosbox がポップアップします。わーい!成功!つまり、引数を追加しようとするまでです。これは失敗します:
os.startfile("perf_test.py 5")
「指定されたファイルが見つかりません」というエラーが表示されます...ファイル名に「[SPACE]5」が追加されているためです。(引数の目的は、各 "perf_test" に ID を割り当てる必要があるため、それらが異なるインスタンスとしてサーバーにヒットすることです。)
私が検討した他のアプローチは、さまざまな理由で本当に好きではありません。
- 各「perf_test」を独自のスレッドで実行します。(しかし、私は本当に出力をそれぞれのコンソールで見たいと思っています。)
- Tk を使用して独自の疑似コンソールを作成します。(図では、さまざまなスレッドの問題に遭遇します。)
- 「start perf_test.py 1」、「start perf_test.py 2」などの行を使用して動的に .BAT ファイルをオンザフライで書き込み、その .BAT ファイルを
Popen
またはで起動しますstartfile
。
最後の手段がうまくいくと思います...そして、Pythonスクリプトで直接実行できない場合は、最後の手段だと思います。
ご意見やご感想をお寄せいただきありがとうございます。