web-dev-qa-db-ja.com

隠しウィンドウを備えたクロスプラットフォームサブプロセス

バックグラウンドでプロセスを開いて操作したいのですが、このプロセスはLinuxとWindowsの両方で表示されないはずです。 Windowsでは、STARTUPINFOを使用していくつかの作業を行う必要がありますが、これはLinuxでは無効です。

ValueError:startupinfoはWindowsプラットフォームでのみサポートされています

OSごとに個別のPopenコマンドを作成するよりも簡単な方法はありますか?

if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    proc = subprocess.Popen(command, startupinfo=startupinfo)
if os.name == 'posix':
    proc = subprocess.Popen(command)    
37
endolith

あなたは1行を減らすことができます:)

startupinfo = None
if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen(command, startupinfo=startupinfo)
37
Anurag Uniyal

注:Python 2.7の場合、subprocess._subprocess.STARTF_USESHOWWINDOWの代わりにsubprocess.STARTF_USESHOWWINDOWを使用する必要があります。

12
goertzenator

あなたがやったことよりもずっと簡単にできるかどうかはわかりません。あなたはおそらく5行のコードを最適化することについて話している。お金のために、私は自分のプロジェクトに取り掛かり、これをクロスプラットフォーム開発の結果として受け入れます。頻繁に行う場合は、ロジックをカプセル化してインポートするための特殊なクラスまたは関数を作成します。

4
SpliFF

コードを次のように変換できます。

params = dict()

if os.name == 'nt':
    startupinfo = subprocess.STARTUPINFO()
    startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
    params['startupinfo'] = startupinfo

proc = subprocess.Popen(command, **params)

しかし、それはそれほど良くはありません。

1
Nicolas Dumazet