コード ファイルを として保存すると.pyw
、コンソール ウィンドウが表示されなくなりますが、コードに への呼び出しが含まれているとos.system
、厄介なコンソール ウィンドウが表示されます。への呼び出しが原因だと思いos.system
ます。.pyw
コンソール ウィンドウをまったく表示せずに、スクリプト内から他のファイルを実行する方法はありますか?
6 に答える
フラグを保持する属性とフラグを保持する属性を持つクラスのパラメーターの値のインスタンスsubprocess.Popen
としてクラスを渡す必要があります。これは、ソース コードの866 ~ 868行を読むことで推測できます。コンソールを開かない状態で実行するときに、パラメーターの値としてフラグも渡す必要がある場合があります。startupinfo
subprocess.STARTUPINFO
dwFlags
subprocess.STARTF_USESHOWWINDOW
wShowWindow
subprocess.SW_HIDE
subprocess.py
subprocess.CREATE_NEW_CONSOLE
creationflags
pythonw.exe
使用するshell=True
と、上記のすべてが正しく設定されているだけですが、それが適切な解決策であるとは限りません。コマンドインタープリターの実行と引数の解析のオーバーヘッドが追加されるためではないと私は主張します。さらに、 (...)サブプロセス モジュールのドキュメントに従ってコマンド文字列が外部入力から構築される場合、shell=True の使用は強く推奨されません。
Piotr が説明する解決策は、実際には聞こえるほど複雑ではありません。コンソール ウィンドウを非表示にする呼び出しにastartupinfo
が渡される例を次に示します。check_call
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
subprocess.check_call(cmd, startupinfo=startupinfo)
便利な関数call
、check_call
、およびはコンストラクターにcheck_output
転送されるため、直接使用する必要はありません。**kwargs
Popen
Popen
コンソール ウィンドウの起動を避けたい場合は、サブプロセスモジュール (など) を引数と共に使用してみてください。subprocess.Popen
subprocess.call
shell=True
'os.popen' はコンソール ウィンドウを生成しないようです。スクリプトは「pythonw」の下で実行されています。すべてのケースについてはわかりませんが、私の場合はうまく機能します。
os.popen(command)
@firsthandが言ったことと同様に、現在実行中のアプリケーション (「command.com」または「CMD.exe」) を pyw.exe または pythonw.exe に「置き換える」ことを wxPython-user フォーラムで読みました。次のようなものを使用する場合:
os.execl(sys.executable, *([sys.executable]+sys.argv))
別の投稿を見る
この場合、どのように io をパイプするかはわかりませんが。
このアプローチの利点の 1 つは、OS タスクバーが CMD アイコンでいっぱいにならずにスクリプトを複数回実行する場合です。逆に、タスクバーで複数の CMD を最小化してそれらを閉じ始めると、どの CMD がどの pythonw スクリプトに対応しているかを判別できなくなります。