コード ファイルを として保存すると.pyw、コンソール ウィンドウが表示されなくなりますが、コードに への呼び出しが含まれているとos.system、厄介なコンソール ウィンドウが表示されます。への呼び出しが原因だと思いos.systemます。.pywコンソール ウィンドウをまったく表示せずに、スクリプト内から他のファイルを実行する方法はありますか?
6 に答える
フラグを保持する属性とフラグを保持する属性を持つクラスのパラメーターの値のインスタンスsubprocess.Popenとしてクラスを渡す必要があります。これは、ソース コードの866 ~ 868行を読むことで推測できます。コンソールを開かない状態で実行するときに、パラメーターの値としてフラグも渡す必要がある場合があります。startupinfosubprocess.STARTUPINFOdwFlagssubprocess.STARTF_USESHOWWINDOWwShowWindowsubprocess.SW_HIDEsubprocess.pysubprocess.CREATE_NEW_CONSOLEcreationflagspythonw.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転送されるため、直接使用する必要はありません。**kwargsPopenPopen
コンソール ウィンドウの起動を避けたい場合は、サブプロセスモジュール (など) を引数と共に使用してみてください。subprocess.Popensubprocess.callshell=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 スクリプトに対応しているかを判別できなくなります。