您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python執(zhí)行外部命令的方法有哪些”,在日常操作中,相信很多人在Python執(zhí)行外部命令的方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Python執(zhí)行外部命令的方法有哪些”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
1. system函數(shù)
基本的調(diào)用格式如下:
import os os.system("some_command with args");
system函數(shù)會(huì)將命令和參數(shù)傳遞給系統(tǒng)的Shell。這么做非常好,因?yàn)槟鷮?shí)際上可以用這種方式一次運(yùn)行多個(gè)命令,并設(shè)置管道和輸入/輸出重定向。例如:
import os 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)用格式如下:
import os stream = os.popen("some_command with args")
popen函數(shù)與os.system函數(shù)的功能相同,只是popen函數(shù)提供了一個(gè)用于操作文件的對(duì)象,可用使用標(biāo)準(zhǔn)輸入輸出的方式來訪問文件中的數(shù)據(jù)。popen函數(shù)還有其他3種變體,它們對(duì)I/O的處理略有不同。如果將所有內(nèi)容都作為字符串傳遞,那么命令將傳遞到Shell程序;如果將它們作為列表傳遞,則無需擔(dān)心轉(zhuǎn)義任何內(nèi)容。例如:
import os stream = os.popen("cat command.py | grep -n subprocess") print(type(stream)) result = stream.readlines() print(type(result)) print(result)
執(zhí)行這段代碼,會(huì)輸出如下內(nèi)容:
<class 'os._wrap_close'> <class 'list'> ['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)是由于功能過于強(qiáng)大,所以使用起來稍微復(fù)雜一些。例如:
print(subprocess.Popen("echo Hello World", shell=True, stdout=subprocess.PIPE).stdout.read())
這行代碼可以用來替換下面的代碼:
print(os.popen("echo Hello World").read())
關(guān)于Popen類的一個(gè)更復(fù)雜的例子如下:
import subprocess p = subprocess.Popen('ls', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) for line in p.stdout.readlines(): print(line.decode("utf-8").strip()) retval = p.wait()
這段代碼通過標(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ù)
來自subprocess模塊的call函數(shù)。與Popen類一樣,擁有相同的參數(shù),但call函數(shù)只會(huì)等待命令執(zhí)行完并提供返回代碼才結(jié)束。例如:
return_code = subprocess.call("echo Hello World", shell=True) print(return_code)
5. run函數(shù)
如果讀者使用的是Python 3.5或更高版本,則可以使用新的subprocess.run函數(shù),該函數(shù)與上面的代碼非常相似,但是更加靈活,并在命令完成執(zhí)行后返回CompletedProcess對(duì)象。例如:
import subprocess result = subprocess.run(["ls", "-l"]) print(type(result))
6. 類C函數(shù)
os模塊還提供了與C語言類似的fork / exec / spawn函數(shù),但是我不建議直接使用它們,例如:
import os print(os.execl('/bin/ls', ' '))
最后,請(qǐng)注意,對(duì)于這些執(zhí)行外部命令的方法,需要將這些命令執(zhí)行后參數(shù)的字符串傳遞回程序,有時(shí)需要對(duì)這些傳回的字符串進(jìn)行轉(zhuǎn)移。如果你無法完全信任這些字符串,那么有可能會(huì)帶來嚴(yán)重的安全隱患。例如,如果用戶正在輸入字符串的某些/任何部分。如果不確定,請(qǐng)僅將這些方法與常量一起使用。為了更好地說明這一點(diǎn),請(qǐng)看下面的代碼。
print(subprocess.Popen("echo %s " % user_input, stdout=PIPE).stdout.read())
我們可以想象,當(dāng)用戶輸入了“I love your harddisk && rm -rf /”,這將刪除硬盤中的所有數(shù)據(jù)。所以如果你對(duì)用戶的輸入無法完全信任的話,請(qǐng)將變量user_input改成常量,不讓用戶任意輸入。
到此,關(guān)于“Python執(zhí)行外部命令的方法有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。