2016-05-12 25 views
0

のクロスプラットフォームの実行とトラブル私はOSX上でのみWindows上でいくつかのコマンドと完全にコマンドを実行し、次のヘルパーメソッドがあります。たとえばPythonの:サブプロセス

def exec_cmd(cmd): 
    """Run a command and return the status, standard output and error.""" 
    proc = Popen(shlex.split(cmd), stdout=PIPE, stderr=PIPE) 
    stdout, stderr = proc.communicate() 
    # I like to get True or False rather than 0 (True) or 1 (False) 
    # which is just backwards as usually 0 is False and 1 is True 
    status = not bool(proc.returncode) 
    return (status, stdout, stderr) 

を、次のサンプルが完全にすべての作業をコマンド

  • osascript -e 'tell application "Microsoft PowerPoint" to activate
  • osascript -e 'tell application "Microsoft PowerPoint" to quit
  • :Macが私の exec_cmdヘルパーを使用してWindows上で動作しない以下の、しかし

    • "C:\Program Files\Microsoft Office\Office15\Powerpnt.exe" /S "C:\Users\MyUser\example.pptx"
    • Taskkill /IM POWERPNT.EXE /F

    :たとえば3210

    は、以下のサンプルでは、​​私のexec_cmdヘルパーを使用してWindows上で完全にすべての作業をコマンド

  • START "" "C:\Program Files\Microsoft Office\Office15\Powerpnt.exe"

とそれエラー出:

WindowsError: [Error 2] The system cannot find the file specified 

であっても、これは動作しません:

p = Popen(["START", "", "C:\Program Files\Microsoft Office\Office15\Powerpnt.exe"], stdout=PIPE, stderr=PIPE) 

ただし、コマンドラインで同じコマンドだけでこれをやって罰金、あるいは見知らぬ人に動作することを実行しています作品:

なぜos.systemは動作するのですか?彼Popenバージョン?これらは単純なオープンで近いアプリケーションの例ですが、私が実行する予定のいくつかのコマンドの標準出力を得る必要があるので、もっとやりたいと思います。

これを分類する上での助けに感謝します。私はos.systemsubprocess.Popenの基本的な整備を理解できないようです。

答えて

1

STARTはシェルコマンドではないため、この問題が発生しています。ドキュメントによると、os.system() "サブシェルでコマンド(文字列)を実行します"、ここではpopenはありません。 os.system()は効果的に新しいcmd.exeインスタンスを生成し、それにコマンドを渡します。ここではpopenという名前の新しいプロセスが生成されます。

START

+0

もぉと呼ばれるプログラムが存在しないので、あなたはThe system cannot find the file specifiedエラーを取得しています。あなたが正しい。私はアホです。私はそれがWindows上で動作するこのPopenコマンドの恐ろしい 'shell = True'を渡す理由だと思います。 – tsantor