溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python執(zhí)行外部命令的方法有哪些

發(fā)布時(shí)間:2021-10-25 15:33:12 來源:億速云 閱讀:300 作者:iii 欄目:編程語言

這篇文章主要介紹“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í)用的文章!

向AI問一下細(xì)節(jié)

免責(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)容。

AI