2011-08-22 96 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:[错误2]没有这样的文件或目录

我在同一文件夹中的脚本somescript.py虽然。我在这里错过了什么。谢谢

+1

在你的'PATH'里有'.'吗?是somescript.py可执行文件吗? – geoffspear

+1

你为什么试图执行它?为什么不“输入”呢? – tMC

+0

@wooble是的。它也在路径和可执行文件中。是。我也可以导入它。但是,无论如何要知道我在这里做错了什么,因为我认为这应该工作。 – user514946

回答

1

subprocess.call需要与subprocess.Popen相同的参数 - 这是一个字符串列表(argv in c)而不是单个字符串。 你的子进程很可能试图用参数“o”,“m”,“e”运行“s”...

0

子进程调用是一个非常符合文字的系统调用。它可以用于任何泛型进程...因此不知道如何自动处理python脚本。

尝试

call ('python somescript.py') 

如果不工作,你可能想尝试的绝对路径,和/或在你的python脚本......典型的有趣的东西检查权限。

Ĵ

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的?

的Unix将需要一个认领和exec属性的工作:

#!/usr/bin/env python 

作为脚本的第一行和:

chmod u+x script.py 

在命令行或

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

如前面提到过。

如果您将shell=True parameter添加到“呼叫”呼叫,Windows应该可以正常工作。

+5

'call('python script.py')'不适用于非Windows系统。它应该是'check_call([sys.executable或'python','/path/to/script.py'])''。如果指定了'python'可执行文件,则不需要shebang和可执行权限。 – jfs

+0

sys.executable应该足够适合所有理智的情况。 –

2

如果你在Linux/Unix上,你可以完全避免调用(),而不是执行一个全新的Python可执行文件及其环境实例。

import os 

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

os.waitpid(cpid, 0) 

FWIW

+1

只有* nix:使用分支,你将继承父进程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解释器并告诉它用给定的参数执行脚本。

注意,这是从上面的建议不同:

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

这将尝试执行所谓蟒蛇somscript.py程序,这显然不存在。

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

也将工作,但使用字符串作为输入调用是不是跨平台的,是危险的,如果你不是一个建筑的字符串,一般应避免,如果在所有可能的。

+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

看看这个。

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 

或者更好的是在功能包的功能,例如巴兹,然后做这个。

import sys 
from os.path import dirname, abspath 

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

import somescript 
somescript.baz() 

似乎有很多脚本启动python进程或分叉,是一个需求?