為什么使用Python
假設(shè)我們有這么一項(xiàng)任務(wù):簡(jiǎn)單測(cè)試局域網(wǎng)中的電腦是否連通.這些電腦的ip范圍從192.168.0.101到192.168.0.200.
思路:用shell編程.(Linux通常是bash而Windows是批處理腳本).例如,在Windows上用ping ip 的命令依次測(cè)試各個(gè)機(jī)器并得到控制臺(tái)輸出.由于ping通的時(shí)候控制臺(tái)文本通常是"Reply from ... " 而不通的時(shí)候文本是"time out ... " ,所以,在結(jié)果中進(jìn)行字符串查找,即可知道該機(jī)器是否連通.
實(shí)現(xiàn):Java代碼如下:
String cmd="cmd.exe ping ";
String ipprefix="192.168.10.";
int begin=101;
int end=200;
Process p=null;
for(int i=begin;i<end;i++){
p= Runtime.getRuntime().exec(cmd+i);
String line = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
while((line = reader.readLine()) != null)
{
//Handling line , may logs it.
}
reader.close();
p.destroy();
}
這段代碼運(yùn)行得很好,問(wèn)題是為了運(yùn)行這段代碼,你還需要做一些額外的工作.這些額外的工作包括:
編寫(xiě)一個(gè)類文件 編寫(xiě)一個(gè)main方法 將之編譯成字節(jié)代碼 由于字節(jié)代碼不能直接運(yùn)行,你需要再寫(xiě)個(gè)小小的bat或者bash腳本來(lái)運(yùn)行. 當(dāng)然,用C/C++同樣能完成這項(xiàng)工作.但C/C++不是跨平臺(tái)語(yǔ)言.在這個(gè)足夠簡(jiǎn)單的例子中也許看不出C/C++和Java實(shí)現(xiàn)的區(qū)別,但在一些更為復(fù)雜的場(chǎng)景,比如要將連通與否的信息記錄到網(wǎng)絡(luò)數(shù)據(jù)庫(kù).由于Linux和Windows的網(wǎng)絡(luò)接口實(shí)現(xiàn)方式不同,你不得不寫(xiě)兩個(gè)函數(shù)的版本.用Java就沒(méi)有這樣的顧慮.
同樣的工作用Python實(shí)現(xiàn)如下:
import subprocess
cmd="cmd.exe"
begin=101
end=200
while begin<end:
p=subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,
stdin=subprocess.PIPE,
stderr=subprocess.PIPE)
p.stdin.write("ping 192.168.1."+str(begin)+"/n")
p.stdin.close()