2016-08-09 17 views
0

私はコマンドラインスクリプトを実行しようとしています。 command.pyPython実行コマンドライン

import subprocess 
proc = subprocess.Popen('python3 hello.py', stdout=subprocess.PIPE) 
tmp = proc.stdout.read() 
print(tmp) 

とhello.py

print("hello") 

が、それは

FileNotFoundError: [WinError 2]

がどのようにコマンドや印刷結果を実行することができ、エラーが返されます。私が持っている ?

答えて

1

Popenは、あなたのパスにpython3が見つかりません。 python3が実行されたため

主エラーがhello.pyが見つかりませんでした、あなたはstderrに代わり、このエラーを持っているというものであった場合(つまりではありません読み)

python: can't open file 'hello.py': [Errno 2] No such file or directory 

あなたはsubprocessで例外を得ないだろうが、実行するPythonファイルを見つけることができませんでした。

最初に、pythonファイルを実行する場合は、別のプロセスで実行しない方がよいでしょう。

しかし、それでもやりたいのなら、このような引数リストを使って実行する方がよいでしょう。スペースは正しく処理され、すべてのファイルにフルパスを提供します。

import subprocess 
proc = subprocess.Popen([r'c:\some_dir\python3',r'd:\full_path_to\hello.py'], stdout=subprocess.PIPE) 
tmp = proc.stdout.read() 
print(tmp) 

はさらに移動するには:

  • python3ために、それは完全なパスを指定しないようにシステムパスにそれを置くために良いでしょう。また

    import subprocess,os 
    basedir = os.path.dirname(__file__) 
    proc = subprocess.Popen(['python3',os.path.join(basedir,'hello.py')], stdout=subprocess.PIPE) 
    tmp = proc.stdout.read() 
    print(tmp) 
    

    :それが配置されている場合は、スクリプト用として

  • 、たとえば、同じディレクトリおよび現在のスクリプトでは、パスに

改善スニペットをハードコーディングすることを避けることができPopenを最初に渡された引数の種類execvpを実行します。最初の引数が例えば.batというファイルの場合は、接頭辞またはshell=Trueを追加して、Popenに直接実行する代わりにシェルでプロセスを作成するように指示する必要があります。

+0

[OK]を、その私のために動作しますが、 なぜ私は PROCを実行したとき= subprocess.Popen([ 'casperjs'、os.path.join(basedirに、 'casper_script.js')]、STDOUT = subprocess.PIPE)その戻りエラー – ivan

+0

capserjsがインストールされています – ivan

+0

私は "shell = True" – ivan

関連する問題