使用python檢測乙個裝置是否ping的通

2022-03-29 21:43:06 字數 4235 閱讀 5681

使用python檢測乙個裝置是否ping的通

一,subprocess以及常用的封裝函式

執行python的時候,我們都是在建立並執行乙個程序。像linux程序那樣,乙個程序可以fork乙個子程序,並讓這個子程序exec另外乙個程式。在python中,我們通過標準庫中的subprocess包來fork乙個子程序,並執行乙個外部的程式。

subprocess 包中定義有數個建立子程序的函式,這些函式分別以不同的方式建立子程序,所以我們可以根據需要來從中選取乙個使用。另外subprocess還提供了一些 管理標準流(standard stream)和管道(pipe)的工具,從而在程序間使用文字通訊。

subprocess.call()

父程序等待子程序完成

返回退出資訊(returncode,相當於linux exit code)

subprocess.check_call()

父程序等待子程序完成

返回0檢查退出資訊,如果returncode不為0,則舉出錯誤subprocess.calledprocesserror,該物件包含有returncode屬性,可用try…except…來檢查

subprocess.check_output()

父程序等待子程序完成

返回子程序向標準輸出的輸出結果

檢查退出資訊,如果returncode不為0,則舉出錯誤subprocess.calledprocesserror,該物件包含有returncode屬性和output屬性,output屬性為標準輸出的輸出結果,可用try…except…來檢查。

這三個函式的使用方法相類似,下面來以subprocess.call()舉例說明:

**如下:

>>> import subprocess

>>> retcode = subprocess.call(["ls", "-l"])

#和shell中命令ls -a顯示結果一樣

>>> print retcode

0將程式名(ls)和所帶的引數(-l)一起放在乙個表中傳遞給subprocess.call()

shell預設為false,在linux下,shell=false時, popen呼叫os.execvp()執行args指定的程式;shell=true時,如果args是字串,popen直接呼叫系統的shell來執 行args指定的程式,如果args是乙個序列,則args的第一項是定義程式命令字串,其它項是呼叫系統shell時的附加引數。

上面例子也可以寫成如下:

**如下:

>>> retcode =

subprocess.call("ls -l",shell=true)

在 windows下,不論shell的值如何,popen呼叫createprocess()執行args指定的外部程式。如果args是乙個序列,則先用 list2cmdline()轉化為字串,但需要注意的是,並不是ms windows下所有的程式都可以用list2cmdline來轉化為命令列字串。

subprocess.popen()

**如下:

class popen(args, bufsize=0, executable=none, stdin=none, stdout=none,

stderr=none, preexec_fn=none, close_fds=false, shell=false, cwd=none, env=none,

universal_newlines=false, startupinfo=none, creationflags=0)

與上面的封裝不同,popen物件建立後,主程式不會自動等待子程序完成。我們必須呼叫物件的wait()方法,父程序才會等待 (也就是阻塞block),舉例:

**如下:

從執行結果中看到,父程序在開啟子程序之後並沒有等待child的完成,而是直接執行print。

對比等待的情況:

**如下:

>>> import subprocess

>>> child = subprocess.popen('ping -c4 blog.linuxeye.com',shell=true)

>>> child.wait()

>>> print 'parent process'

從執行結果中看到,父程序在開啟子程序之後並等待child的完成後,再執行print。

此外,你還可以在父程序中對子程序進行其它操作,比如我們上面例子中的child物件:

**如下:

child.poll() # 檢查子程序狀態

child.kill() # 終止子程序

child.send_signal() # 向子程序傳送訊號

child.terminate() # 終止子程序

子程序的pid儲存在child.pid

二、子程序的文字流控制

子程序的標準輸入、標準輸出和標準錯誤如下屬性分別表示:

**如下:

child.stdin

child.stdout

child.stderr

可以在popen()建立子程序的時候改變標準輸入、標準輸出和標準錯誤,並可以利用subprocess.pipe將多個子程序的輸入和輸出連線在一起,構成管道(pipe),如下2個例子:

複製** **如下:

>>> import subprocess

>>> child1 = subprocess.popen(["ls","-l"],

stdout=subprocess.pipe)

>>> print child1.stdout.read(),

#或者child1.communicate()

>>> import subprocess

>>> child1 =

subprocess.popen(["cat","/etc/passwd"],

stdout=subprocess.pipe)

>>> child2 = subprocess.popen(["grep","0:0"],stdin=child1.stdout,

stdout=subprocess.pipe)

>>> out = child2.communicate()

subprocess.pipe 實際上為文字流提供乙個快取區。child1的stdout將文字輸出到快取區,隨後child2的stdin從該pipe中將文字讀取走。child2 的輸出文字也被存放在pipe中,直到communicate()方法從pipe中讀取出pipe中的文字。

注意:communicate()是popen物件的乙個方法,該方法會阻塞父程序,直到子程序完成

三、檢視某個裝置是否ping的通(原始碼)

1

import

subprocess23

45deftest():

67 str1 = '

ping -c 3 '8

9 str2 = '

192.168.4.6'10

11 str3 = '

| grep \'0 received\' | wc -l'12

13 command = str1 + str2 +str3

1415

print

command

1617 p = subprocess.popen(command,shell=true, stdout=subprocess.pipe)

1819 result =p.stdout.read()

2021

print

result.strip()

2223

2425

if__name__ == "

__main__":

2627 test()

操作乙個裝置

操作乙個裝置 無論有沒有作業系統,無論目標平台如何,控制乙個外部裝置的具體步驟都是一樣的。它始終包括如下步驟 迎合裝置電平特性 要使用乙個裝置首先要讓裝置得到它想要的。首先就是給裝置供電。供電從來都不是一件輕輕鬆鬆的事情。交流或直流 對於裝置的工作電壓可能是交流或直流,或同時都有,比如乙個數控的交流...

python 是否是乙個整數

問題描述 輸入乙個字串,判別它是否符合整數的寫法。正整數的寫法是 用數字開頭,其後可以跟數字。負整數的寫法是 用負號開頭,其後跟數字。輸入的字串的頭尾可能包含空格。輸入形式 一行。乙個字串。輸出形式 yes或者no。如果符合整數寫法,輸出yes,否者輸出no。樣例輸入 897 樣例輸出 yes 樣例...

Python實現乙個簡單的目標檢測

輸入測試 用選擇性搜尋 select search 方法,對輸入選出n個候選區域 用訓練好的cnn模型 每個候選區域,保留乙個得分最高的候選區域 輸出 結果 import sys import cv2 import numpy as np import tensorflow as tf from t...