日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使出Python的六脈神劍,讓Python擁有無(wú)限擴(kuò)展性

我們知道,Python的API非常多,功能非常強(qiáng)大,而且非常易用。Python之所以強(qiáng)大,一個(gè)重要原因是因?yàn)镻ython非常容易與其他編程語(yǔ)言交互。這就讓Python擁有了無(wú)限擴(kuò)展性。就算Python無(wú)法實(shí)現(xiàn)某個(gè)功能,可以用其他語(yǔ)言實(shí)現(xiàn),然后Python直接調(diào)用即可。

企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對(duì)外擴(kuò)展宣傳的重要窗口,一個(gè)合格的網(wǎng)站不僅僅能為公司帶來(lái)巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺(tái),創(chuàng)新互聯(lián)面向各種領(lǐng)域:成都活動(dòng)板房成都網(wǎng)站設(shè)計(jì)、營(yíng)銷型網(wǎng)站建設(shè)解決方案、網(wǎng)站設(shè)計(jì)等建站排名服務(wù)。


Python與其他編程語(yǔ)言交互,主要有如下兩種方法:

(1)調(diào)用動(dòng)態(tài)庫(kù),如.dll,.so等;

(2)直接執(zhí)行外部命令,并接收外部命令的返回結(jié)果;

第1種方法我會(huì)在后面的文章中詳細(xì)討論,本文主要講解如何使用Python執(zhí)行外部的命令,并傳遞參數(shù)和接收返回值,然后做更進(jìn)一步的處理。本文將介紹6種執(zhí)行外部命令的方法,并比較這6中方法的優(yōu)缺點(diǎn)。史稱這6種執(zhí)行外部命令的方法為六脈神劍。

Python執(zhí)行外部命令的6種方法:

1. system函數(shù)

基本的調(diào)用格式如下:

 
 
 
 
  1. import os 
  2. os.system("some_command with args"); 

system函數(shù)會(huì)將命令和參數(shù)傳遞給系統(tǒng)的Shell。這么做非常好,因?yàn)槟鷮?shí)際上可以用這種方式一次運(yùn)行多個(gè)命令,并設(shè)置管道和輸入/輸出重定向。例如:

 
 
 
 
  1. import os 
  2. os.system("cat command.py | grep -n subprocess > result.txt") 

執(zhí)行這段代碼,會(huì)在當(dāng)前目錄生成一個(gè)result.txt文件。

盡管這樣做很方便,但必須手動(dòng)處理轉(zhuǎn)義字符(例如空格等)。所以這樣做只是讓你簡(jiǎn)單地運(yùn)行Shell程序,而不是擴(kuò)展程序的功能。

2. popen函數(shù)

基本調(diào)用格式如下:

 
 
 
 
  1. import os 
  2. stream = os.popen("some_command with args") 

popen函數(shù)與os.system函數(shù)的功能相同,只是popen函數(shù)提供了一個(gè)用于操作文件的對(duì)象,可用使用標(biāo)準(zhǔn)輸入輸出的方式來(lái)訪問(wèn)文件中的數(shù)據(jù)。popen函數(shù)還有其他3種變體,它們對(duì)I/O的處理略有不同。如果將所有內(nèi)容都作為字符串傳遞,那么命令將傳遞到Shell程序;如果將它們作為列表傳遞,則無(wú)需擔(dān)心轉(zhuǎn)義任何內(nèi)容。例如:

 
 
 
 
  1. import os 
  2. stream = os.popen("cat command.py | grep -n subprocess") 
  3. print(type(stream)) 
  4. result = stream.readlines() 
  5. print(type(result)) 
  6. print(result) 

執(zhí)行這段代碼,會(huì)輸出如下內(nèi)容:

 
 
 
 
  1.  
  2.  
  3. ['1:import subprocess\n', '2:subprocess.run(["ls", "-l"])\n', '5:subprocess.call(["ls", "-l"])\n', '8:os.system("cat command.py | grep -n subprocess > result.txt")\n'] 

我們可以看到,readlines方法以列表形式返回命令的執(zhí)行結(jié)果。

3. Popen類

subprocess模塊的Popen類。該類可用于替換os.popen函數(shù)。但Popen類的缺點(diǎn)是由于功能過(guò)于強(qiáng)大,所以使用起來(lái)稍微復(fù)雜一些。例如:

 
 
 
 
  1. print(subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read()) 

這行代碼可以用來(lái)替換下面的代碼:

 
 
 
 
  1. print(os.popen("echo Hello World").read()) 

關(guān)于Popen類的一個(gè)更復(fù)雜的例子如下:

 
 
 
 
  1. import subprocess 
  2. p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
  3. for line in p.stdout.readlines(): 
  4.     print(line.decode("utf-8").strip()) 
  5. retval = p.wait() 

這段代碼通過(guò)標(biāo)準(zhǔn)輸出的readlines方法讀取了ls命令返回結(jié)果的所有行,并將這些內(nèi)容輸出到Console。最后用wait方法等待ls命令執(zhí)行完,最后結(jié)束程序。

Popen類相對(duì)于popen函數(shù)的優(yōu)勢(shì)是將所有的選項(xiàng)都統(tǒng)一放在了Popen類中,而不是需要4個(gè)不同的popen函數(shù)完成這些工作。

4.call函數(shù)

來(lái)自subprocess模塊的call函數(shù)。與Popen類一樣,擁有相同的參數(shù),但call函數(shù)只會(huì)等待命令執(zhí)行完并提供返回代碼才結(jié)束。例如:

 
 
 
 
  1. return_code = subprocess.call("echo Hello World", shell=True) 
  2. print(return_code) 

5. run函數(shù)

如果讀者使用的是Python 3.5或更高版本,則可以使用新的subprocess.run函數(shù),該函數(shù)與上面的代碼非常相似,但是更加靈活,并在命令完成執(zhí)行后返回CompletedProcess對(duì)象。例如:

 
 
 
 
  1. import subprocess 
  2. result = subprocess.run(["ls", "-l"]) 
  3. print(type(result)) 

6. 類C函數(shù)

os模塊還提供了與C語(yǔ)言類似的fork / exec / spawn函數(shù),但是我不建議直接使用它們,例如:

 
 
 
 
  1. import os 
  2. print(os.execl('/bin/ls', ' ')) 

最后,請(qǐng)注意,對(duì)于這些執(zhí)行外部命令的方法,需要將這些命令執(zhí)行后參數(shù)的字符串傳遞回程序,有時(shí)需要對(duì)這些傳回的字符串進(jìn)行轉(zhuǎn)移。如果你無(wú)法完全信任這些字符串,那么有可能會(huì)帶來(lái)嚴(yán)重的安全隱患。例如,如果用戶正在輸入字符串的某些/任何部分。如果不確定,請(qǐng)僅將這些方法與常量一起使用。為了更好地說(shuō)明這一點(diǎn),請(qǐng)看下面的代碼。

 
 
 
 
  1. print(subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read()) 

我們可以想象,當(dāng)用戶輸入了“I love your harddisk && rm -rf /”,這將刪除硬盤中的所有數(shù)據(jù)。所以如果你對(duì)用戶的輸入無(wú)法完全信任的話,請(qǐng)將變量user_input改成常量,不讓用戶任意輸入。

本文轉(zhuǎn)載自微信公眾號(hào)「極客起源」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系極客起源公眾號(hào)。


網(wǎng)站欄目:使出Python的六脈神劍,讓Python擁有無(wú)限擴(kuò)展性
轉(zhuǎn)載來(lái)于:http://www.dlmjj.cn/article/djjgsch.html