web-dev-qa-db-ja.com

新しいシェルを生成して、PythonベースからのスクリプトPythonスクリプト?

いくつかのPythonスクリプトを正常に実行し、サブプロセスモジュールを使用してベーススクリプトから呼び出します。

subprocess.popen([sys.executable, 'script.py'], Shell=True)

ただし、これらの各スクリプトは、シェルへの出力を生成するシミュレーション(C++アプリケーションの.exeファイル)を実行します。これらのすべての出力は、これらのスクリプトを起動したベースシェルに書き込まれます。スクリプトごとに新しいシェルを生成したいと思います。 subprocess.callを呼び出すときにShell=True属性を使用して新しいシェルを生成しようとしました(同様にpopenで試しました)が、機能しません。

Subprocess.callで生成されたプロセスごとに新しいシェルを取得するにはどうすればよいですか?

私はスペンサーが提案したstdinとstdoutに関するドキュメントを読んでいて、問題を解決したフラグsubprocess.CREATE_NEW_CONSOLEを見つけました。パイプをリダイレクトすることも仕事をするかもしれませんが、これは最も単純な解決策のようです(少なくともこの特定の問題については)。私はちょうどそれをテストし、完璧に働いた:

subprocess.popen([sys.executable, 'script.py'], creationflags = subprocess.CREATE_NEW_CONSOLE)
28
emiguel

Popenは、物事を処理するサブプロセスをすでに生成しています。出力パイプをリダイレクトするだけです。 subprocess ドキュメンテーション、特にpopen stdin、stdout、およびstderrリダイレクトに関するセクションを参照してください。

これらのパイプをリダイレクトしない場合、親から継承します。プロセスのデッドロックに注意してください。

各サブプロセスに追加のウィンドウが必要でした。これも同様に処理されます。サブプロセスの startupinfo セクションを見てください。サブプロセスごとに新しいターミナルを生成するためにウィンドウに設定するオプションについて説明します。 Shell = Trueオプションを使用する必要があることに注意してください。

10
Spencer Rathbun

別のコンソールで開くには、次を実行します(Windows 7でテスト済み/ Python 3):

from sys import executable
from subprocess import Popen, CREATE_NEW_CONSOLE

Popen([executable, 'script.py'], creationflags=CREATE_NEW_CONSOLE)

input('Enter to exit from this launcher script...')
42
Pedro Vagner

これは実際にはあなたの質問に答えません。しかし、サブプロセスにも問題があり、 pexpect が非常に役立つことが判明しました。

2