2011-08-22 30 views
15

私は、同じディレクトリ内の別のpythonスクリプトを呼び出す必要があるpythonスクリプトを持っています。 私はこれをしなかった:pythonサブプロセス呼び出しを使用してpythonスクリプトを呼び出す

from subprocess import call 
    call('somescript.py') 

私は、取得するには、次のエラー

call('somescript.py') 
    File "/usr/lib/python2.6/subprocess.py", line 480, in call 
    return Popen(*popenargs, **kwargs).wait() 
    File "/usr/lib/python2.6/subprocess.py", line 633, in __init__ 
    errread, errwrite) 
    File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child 
raise child_exception 

OSErrorの:[errnoを2]そのようなファイルやディレクトリ

は、私は、同じフォルダ内のスクリプトsomescript.pyを持っていませんしかし、。私はここで何かを逃している。ありがとう

+1

あなたの 'PATH'に' .'がありますか? somescript.pyは実行可能ですか? – geoffspear

+1

なぜそれを実行しようとしていますか?なぜそれを '輸入'しないのですか? – tMC

+0

@woobleはい。それはパスにあり、実行可能でもあります。はい。私もそれをインポートすることができます。しかし、どちらかといえば、私はこれがうまくいくと思いますので、私がここで間違っていることを知りたいと思うでしょう。 – user514946

答えて

1

subprocess.callは、subprocess.Popenと同じ引数を期待しています - それは文字列のリスト(cのargv)です。 子プロセスがパラメータ "o"、 "m"、 "e"を使って "s"を実行しようとした可能性があります...

0

サブプロセスコールは非常にリテラルなシステムコールです。任意の一般的なプロセスに使用することができます...したがって、Pythonスクリプトで自動的に何をすべきか分かりません。

は...それが動作しない場合、あなたは絶対パスを試してみたい、および/またはあなたのPythonスクリプトのチェック権限かもしれない典型的な楽しさのものを

call ('python somescript.py') 

を試してみてください。

J

0

まずsomescript.pyが実行可能であると#!/usr/bin/pythonの線に沿って何かで始まる場合、確認してください。 これが完了したら、subprocess.call('./somescript.py')を使用できます。

また、別の回答として、subprocess.call(['python', 'somescript.py'])を指定することもできます。

+0

ランダムなポインタ:#!/ usr/bin/env pythonを使うと便利です。モジュールがロードされていれば、ロードされたpythonのバージョンで自動的に実行されます。 – Vorticity

5

Windows? Unix?スクリプトの最初の行として

#!/usr/bin/env python 

と::

Unixのは仕事にシェバングとexec属性が必要になりますコマンドラインまたは

call('python script.py'.split()) 

chmod u+x script.py 

として前述した。

「コール」コールにshell=True parameterを追加すると、Windowsが動作するはずです。

+5

'call( 'python script.py')'は非Windowsシステムでは動作しません。 'check_call([sys.executable or 'python'、 '/path/to/script.py'])'でなければなりません。また、 'python'実行可能ファイルが指定されている場合は、シバンと実行可能パーミッションは必要ありません。 – jfs

+0

sys.executableはすべての正常な状況に十分でなければなりません。 –

2

Linux/Unixの場合、call()を完全に避けて、全く新しいPython実行ファイルとその環境を実行することはできません。

import os 

cpid = os.fork() 
if not cpid: 
    import somescript 
    os._exit(0) 

os.waitpid(cpid, 0) 

FWIW

+1

* nix:forkを使用すると、親プロセスのPythonインタプリタから継承します(既存のインポートはすべて...)。あなたが新しい解釈を望むなら、これは良い選択ではありません。 diff fork/exec unixシステムコールを参照してください。 –

+0

'subprocess'モジュールは、POSIXシステムでは' fork/exec'を、Windowsでは 'CreateProcess'を使います。 Pythonスクリプトを実行したい場合は 'fork'を直接使う必要はありません。 – jfs

17

「somescript.py」はあなたが通常のコマンドライン(すなわち$: somescript.py作品)から直接実行することができるものではありません場合は、直接呼び出しを使用して、それを呼び出すことはできません。

Popenの仕組みは、最初の引数は実行するプログラムであり、残りはそのプログラムに渡される引数であることに注意してください。この場合、プログラムは実際にpythonであり、スクリプトはありません。したがって、以下のように動作します:

subprocess.call(['python', 'somescript.py', somescript_arg1, somescript_val1,...]). 

これは正しくpythonインタプリタを呼び出し、与えられた引数でスクリプトを実行するように指示します。これは上記の提案とは異なることを

注:明確に存在していないのpython somscript.pyと呼ばれるプログラムを実行しようとする

subprocess.call(['python somescript.py']) 

call('python somescript.py', shell=True) 

も、動作しますが、呼び出すための入力として文字列を使用すると、クロスプラットフォームではありませんでしょうあなたは、文字列を構築する1でない場合は危険であり、一般的にすべての可能であれば避けるべきです。

+0

私はこの問題を抱えていますが、スクリプトのパスはbasrcファイルにありますので、myscript(args)としてターミナルから呼び出すことができます。私は上記のPythonからやろうとすると、私はエラーが見つかりません? – rankind

0
def main(argv): 
    host = argv[0] 
    type = argv[1] 
    val = argv[2] 

    ping = subprocess.Popen(['python ftp.py %s %s %s'%(host,type,val)],stdout = subprocess.PIPE,stderr = subprocess.PIPE,shell=True) 
    out = ping.communicate()[0] 
    output = str(out) 
    print output 
2

これをチェックしてください。関数内での機能をラップし、より良いまだ

import sys 
from os.path import dirname, abspath 

local_dir = abspath(dirname(__file__)) 
sys.path.append(local_dir) 

import somescript 

かと間違って何

from subprocess import call 
with open('directory_of_logfile/logfile.txt', 'w') as f: 
    call(['python', 'directory_of_called_python_file/called_python_file.py'], stdout=f) 
1

、例えばバズ、その後これをやってください。

import sys 
from os.path import dirname, abspath 

local_dir = abspath(dirname(__file__)) 
sys.path.append(local_dir) 

import somescript 
somescript.baz() 

Pythonプロセスやフォークを開始するスクリプトがたくさんあるようですが、それは要件ですか?

関連する問題