2014-04-05 89 views
-1

我在python腳本給得到錯誤,同時通過

subprocess.call(['ping', '127.0.0.1', '>>', 'out15.txt']) 

聲明subprocess.call()執行ping操作。

但我收到未知的主機錯誤。

請讓我知道爲什麼我得到這個錯誤。

+0

是'localhost'工作?最新錯誤? – Arvind

+0

是的localhost正在工作,錯誤是「ping未知主機」@Arvind – bvb

+0

你似乎期待shell解釋。這不是'ping'知道如何去做的事情;這是'bash'或者你使用的任何shell。有一個shell命令將命令通過shell,但它是一個柺杖。以其他方式獲得效果更安全。 – user2357112

回答

0

原因您將>> out15.txt傳遞給ping作爲參數。 >>是cmd \ bash的特殊字符。如果硬要將輸出重定向與命令文件,而不是使用Python代碼,你可以是這樣做的:

subprocess.call(['cmd', '/c', 'ping', '127.0.0.1', '>>', 'out15.txt']) 

同樣對於bash。

+0

你能解釋我爲什麼你給cmd,/ c在subprocess.call()@Ori Seri – bvb

+0

正如我所說的,'>>'是cmd的一個特殊字符。 Ping不知道這個標誌,它把它作爲你想要ping的主機的一部分,並試圖解決它。所以,我打開了cmd進程而不是ping進程。/c參數告訴cmd運行以下命令並退出(在我們的例子中爲ping)。 Cmd引用'>>'作爲重定向,因此將ping的stdout重定向到一個文件。注意:cmd進程負責重定向輸出,而不是ping進程。 –

+0

Iam得到錯誤OSError(Errno 2):沒有這樣的文件或目錄,當我給了subprocess.call(),如上所述 - @ Ori Seri – bvb

0

由於@Ori Seri pointed out>>通常是由一個shell解釋:

from subprocess import call 

call('ping 127.0.0.1 >> out15.txt', shell=True) 

注:與shell=True字符串參數。

你可以做它沒有外殼:

with open('out15.txt', 'ab', 0) as output_file: 
    call(["ping", "127.0.0.1"], stdout=output_file) 

注:與shell=False(默認值)列表的說法。

您不需要編寫輸出文件來解釋ping結果;您可以使用退出狀態代替:

from subprocess import call, DEVNULL 

ip = "127.0.0.1" 
rc = call(["ping", '-c', '3', ip], stdout=DEVNULL) 
if rc == 0: 
    print('%s active' % ip) 
elif rc == 2: 
    print('%s no response' % ip) 
else: 
    print('%s error' % ip) 

請參閱Multiple ping script in Python