36

Windowsでこれを行うのがなぜそれほど難しいのかわかりません。

他のスクリプトを実行する一連のコマンドプロンプトウィンドウを生成したいと思います。これが必要な理由は、各スクリプトからのすべての出力をきれいに表示できるようにするためです(メインウィンドウにスレッド/サブプロセスだけがある場合、すべての出力を正しく表示できません)。また、出力はログファイルでは実際には機能しないプログレスバーを表示するためのものであるため、ログに記録したくありません。

したがって、要件の個々の部分は機能しますが、一緒には機能しません。

os.system("start cmd /c {command here}")     # Launches in new command prompt, closes when done

ただし、OSシステムでは、コマンドが終了するまで待機できません(startは実際のコマンドであるため、2番目に新しいコマンドプロンプトを開いて「完了」します)

同様に私が試してみると:

p = subprocess.Popen(["start", "cmd", "/k", "{command here}"], shell = True) # Needs to be shell since start isn't an executable, its a shell cmd
p.wait()    # I can wait until finished (although it too finishes after start finishes)

では、どうすればこれを行うことができますか?解決策はプロセスグループを使用することかもしれないとどこかで読んだのですが、それはUNIXだけです....またはそのようなもの

または、すべてのサブプロセスからの出力を1つのウィンドウに表示するための適切な方法がある場合は、新しいコマンドプロンプトを開く必要はなく、スレッドを使用するだけで済みます。それも機能しますが、4つのスレッドが何かをダウンロードしてプログレスバーを表示したり、他の情報を出力したりすると、読み取り可能な方法でそれを表示する方法がわかりません(また、すべてのスレッドが衝突しないようにする必要があります)お互い)。

PS:これはWindowsVistaです。PPS:できれば、Windows、Linux、Macで動作するソリューションが欲しいです。今は、Windowsに焦点を当てていますが、3つすべてで動作するソリューションが欲しいのですが、Windowsが最も厄介です。OSの適切なコマンドを「startcmd/c」に置き換えます。

4

6 に答える 6

48

私の以前の答えに対するあなたのコメントを読んだとき、あなたが必要とするものは次のとおりです。

os.system("start /wait cmd /c {command}")

Windowsコマンドリファレンスを常に手元に置いてください。

于 2012-07-23T15:25:05.440 に答える
20

受け入れられた答えは私にはうまくいきませんでした。
新しいコマンドプロンプトで開くには、次を使用する必要がありました。

os.system("start /B start cmd.exe @cmd /k mycommand...")
于 2016-11-24T14:06:05.850 に答える
11

私にとってこれはうまくいくようです
os.system("cmd /k {command}")

/kcmdを実行してから、開いたままにします。
実行/cして閉じると

新しいコマンドウィンドウを開いてからコマンドを実行するには
os.system("start cmd /k {command}")

于 2020-03-20T21:27:50.270 に答える
4

/ WAITをstartコマンドに渡して、終了を待機させることができます。

于 2012-07-23T15:25:21.787 に答える
2

どうですか

os.system("cmd /c {command here}") 

あるいは

os.system("{command here}")

Pythonプログラムが実行されているのと同じセッションを使用する代わりに、別のセッションを起動するのは開始コマンドです。

于 2012-07-23T15:21:27.280 に答える
0

( https://stackoverflow.com/a/11615580/3312367で指摘されているように)新しいcmd-windowを開く最も簡単な方法は、

os.system("start /wait cmd /c {command}")

ただし、コマンドがスペースやその他の制御文字を含む複雑なコマンドである場合は、あまり役に立ちません。そのために私は使用します:

subprocess.run(["start", "/wait", "cmd", "/K", command, "arg /?\^"], shell=True)
于 2021-10-11T16:35:45.743 に答える