web-dev-qa-db-ja.com

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] No such file or directory

ただし、同じフォルダーにsomescript.pyというスクリプトがあります。ここに何かが足りませんか?

29
user514946

'somescript.py'がコマンドラインから直接実行できるものでない場合(つまり、$: somescript.pyは機能します)、callを使用して直接呼び出すことはできません。

Popenの仕組みは、最初の引数が実行するプログラムであり、残りがそのプログラムに渡される引数であることを忘れないでください。この場合、プログラムは実際にはpythonであり、スクリプトではありません。したがって、以下は期待どおりに機能します。

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

これはPythonインタープリターを正しく呼び出し、指定された引数でスクリプトを実行するように指示します。

これは上記の提案とは異なることに注意してください。

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

python somscript.pyというプログラムが実行されますが、これは明らかに存在しません。

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

動作しますが、呼び出しへの入力として文字列を使用することはクロスプラットフォームではなく、文字列を作成している人でない場合は危険であり、一般的には可能な限り回避する必要があります。

37
aruisdante

Windows? Unix?

Unixが機能するには、Shebangおよびexec属性が必要です。

#!/usr/bin/env python

スクリプトの最初の行として:

chmod u+x script.py

コマンドラインまたは

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

前述のとおり。

Shell = True parameter を「呼び出し」呼び出しに追加すると、Windowsが動作するはずです。

5
Gringo Suave

subprocess.callには、subprocess.Popenと同じ引数が必要です。これは、単一の文字列ではなく、文字列のリスト(Cのargv)です。

子プロセスがパラメーター「o」、「m」、「e」などを使用して「s」を実行しようとした可能性は十分にあります。

3
immortal

これをチェックしてください。

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)
3
tanmoy

Linux/Unixを使用している場合は、call()を完全に回避し、Python実行可能ファイルとその環境のまったく新しいインスタンスを実行しないでください。

import os

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

os.waitpid(cpid, 0)

それが価値があるもののために。

2
tMC

どうしたの

import sys
from os.path import dirname, abspath

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

import somescript

あるいは、機能を関数でラップすることをお勧めします。バズ、これをしてください。

import sys
from os.path import dirname, abspath

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

import somescript
somescript.baz()

pythonプロセスまたはフォークを開始する多くのスクリプトがあるようです。それは要件ですか?

1
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
0
user3489691

まず、_somescript.py_が実行可能で、_#!/usr/bin/python_の行に沿って何かで始まるかどうかを確認します。これが完了したら、subprocess.call('./somescript.py')を使用できます。

または、別の答えが指摘するように、subprocess.call(['python', 'somescript.py'])を実行できます。

0
Barum Rho