2009-06-19 2 views
28

プロセスをバックグラウンドで開いて対話したいが、このプロセスはLinuxとWindowsの両方で不可視でなければならない。これは、Linuxでは有効ではありませんしながら、Windowsでは、あなたは、STARTUPINFOでいくつかのものをしなければならない。隠しウィンドウ付きのクロスプラットフォームサブプロセス

ValueError: startupinfo is only supported on Windows platforms

は、各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)  

答えて

31

あなたは1行:)ただ、ノート

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

Aha。私はstartupinfo = ''を試していて、うまくいかなかった。これは私が探していた答えです。 – endolith

+1

私はちょうどそれらのエラーメッセージを生成する方法を見るためにサブプロセスコードを見て、startupinfoがNoneでないかどうかを確認します。これはPythonのように –

+3

です。 'STARTF_SHOWWINDOW'を設定した場合、' wShowWindow'のメンバも'startupinfo'を' SW_ * '定数の1つに置き換えます。このメソッドは、実際に 'wShowWindow'フラグを実行して実行するプログラムに依存します。そうする必要はありません。 –

3

あなたがしたことよりもはるかに簡単になることは確かです。おそらく5行のコードを最適化することを話しています。お金のために、私は自分のプロジェクトで乗り越え、これをクロスプラットフォーム開発のコンスムとして受け入れます。あなたがそれをたくさんしたら、特殊なクラスや関数を作り、ロジックをカプセル化してインポートします。

1

あなたはにあなたのコードを変えることができます:

params = dict() 

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

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

が、それははるかに良いではありません。

+2

すべてのシステムでparamsを作成する必要はありません。Popenは、startupinfoを受け入れますが、posixにはNoneを指定してください。なし –

12

を減らすことができますのためのPython 2.7を私はsubprocess._subprocess.STARTF_USESHOWWINDOWの代わりsubprocess.STARTF_USESHOWWINDOW使用する必要があります。

+1

ありがとう、これはちょうど私が必要としたヒントでした。 –

+0

関連するPythonの問題9861:[サブプロセスのモジュールが公開された属性を変更しました] –

+1

Python 2.7のどのバージョンですか? * https://code.google.com/p/googleappengine/issues/detail?id=10363#c2によると、* 'subprocess.STARTF_USESHOWWINDOW'はPython 2.7.2の後に追加されています。* –

関連する問題