2011-08-22 132 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進程或分叉,是一個需求?