同じディレクトリで別の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というスクリプトがあります。ここに何かが足りませんか?
'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)
動作しますが、呼び出しへの入力として文字列を使用することはクロスプラットフォームではなく、文字列を作成している人でない場合は危険であり、一般的には可能な限り回避する必要があります。
Windows? Unix?
Unixが機能するには、Shebangおよびexec属性が必要です。
#!/usr/bin/env python
スクリプトの最初の行として:
chmod u+x script.py
コマンドラインまたは
call('python script.py'.split())
前述のとおり。
Shell = True parameter を「呼び出し」呼び出しに追加すると、Windowsが動作するはずです。
subprocess.call
には、subprocess.Popen
と同じ引数が必要です。これは、単一の文字列ではなく、文字列のリスト(Cのargv
)です。
子プロセスがパラメーター「o」、「m」、「e」などを使用して「s」を実行しようとした可能性は十分にあります。
これをチェックしてください。
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)
Linux/Unixを使用している場合は、call()を完全に回避し、Python実行可能ファイルとその環境のまったく新しいインスタンスを実行しないでください。
import os
cpid = os.fork()
if not cpid:
import somescript
os._exit(0)
os.waitpid(cpid, 0)
それが価値があるもののために。
どうしたの
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プロセスまたはフォークを開始する多くのスクリプトがあるようです。それは要件ですか?
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
まず、_somescript.py
_が実行可能で、_#!/usr/bin/python
_の行に沿って何かで始まるかどうかを確認します。これが完了したら、subprocess.call('./somescript.py')
を使用できます。
または、別の答えが指摘するように、subprocess.call(['python', 'somescript.py'])
を実行できます。