當前位置:首頁 » 編程語言 » python執行shell

python執行shell

發布時間: 2023-02-28 23:18:34

python shell怎麼使用

Python 中執行 Shell 命令有多種方法,stackoverflow 上有對這些方法進行比較的討論,Calling an external command in Python 指出使用subprocess模塊來實現更優。因此,本文說明如何使用subprocess模塊來實現 Shell 腳本的功能。
subprocess模塊提供多種方法來實現執行 Linux 的命令,例如subprocess.call()方法,subprocess.check_call()方法,等。這些方法都是對Popen類的封裝,故本文著重講述Popen類的使用。

執行 Shell 命令
可以通過向Popen()傳遞需要執行的命令來創建一個Popen對象,這樣,便會創建一個子進程來執行命令。例如:

child = subprocess.Popen(["ping","-c","5","leehao.me"])
1
上面的代碼會創建一個子進程來執行ping -c 5 leehao.me命令,這個命令採用列表的形式傳遞給Popen()方法。如果我們想直接採用ping -c 5 leehao.me字元串形式,可以添加shell=True來實現:

child = subprocess.Popen("ping -c 5 leehao.me", shell=True)
1
官方文檔指出由於安全原因故不建議使用shell=True,詳細說明可以參考官方文檔的描述。

等待子進程執行
子進程執行命令後,主進程並不會等待子進程執行。為了讓主進程等待子進程執行結束,需要顯示調用Popen.wait()方法。例如:

child = subprocess.Popen(["ping","-c","5","leehao.me"])
child.wait()
print 'parent finish'
1
2
3
這樣,主進程會等待子進程執行ping命令完畢後,才會列印出parent finish的輸出。

獲取執行結果
為了獲取Popen()子進程的輸出,可以使用Popen.communicate()方法,例如:

def subprocess_cmd(command):
process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
proc_stdout = process.communicate()[0].strip()
print proc_stdout

subprocess_cmd('echo leehao.me; echo www.leehao.me')
1
2
3
4
5
6
輸出:

leehao.me
www.leehao.me

process.communicate()方法可以實現主進程與子進程的通信。主進程可以通過它向子進程發送數據,也可以讀取子進程的輸出的數據。上面的例子中,我們在創建Popen對象時指定stdout=subprocess.PIPE,這樣主進程便可以讀取子進程的輸出。
communicate()方法返回一個元組:(stdoutdata, stderrdata),process.communicate()[0]即獲取子進程的標准輸出。
需要指出的是,調用communicate()方法後,主進程也會等待子進程執行完畢。
上面的例子中,子進程向標准輸出列印兩個字元串,主進程接收到了這些輸出,並列印出來。

Ⅱ 編寫shell腳本運行python文件

(已嘗試mac自帶的文本編輯器,腳本編輯器無法編寫.sh文件)

運行後出現vim主界面,代表mac有vim,並且成功進入了vim

想要運行.py文件,直接使用絕對路徑即可(此路徑可以通過直接拖進終端即可獲得,或者使用快捷鍵Option+Command+C 復制文件途徑。)
格式: /可執行文件所在目錄/可執行文件

到這里簡單可以運行regression.py文件的shell腳本寫好了。

解決辦法:修改rt.sh文件許可權,命令為:

解決辦法:同問題一

查了資料問題是'(',')'要使用轉義,才可以識別即'(',')'。所以在最開始打開regression.py文件把所有的括弧都加了一遍,這種方法不會再出現括弧的錯誤,但是這並不是一個合理的解決辦法,這樣太麻煩了,而且編寫時是不會這樣處理的,所以在看了另一個別人的腳本時,發現在.py腳本的頭部,即第一行加了一句話

這時使用未做過括弧處理的.py文件,也不會報錯了!

可參考: https://blog.csdn.net/wh_19910525/article/details/8040494

regression.py在不使用rt.sh文件是可以成功運行的,但是此時出現no mole錯誤。
開始以為是quandl自己安裝的問題,在python2.7是Quandl,python3.6是quandl,所以在終端使用pip3,pip分別安裝,但是運行時還會出現同樣問題,但發現一個問題不管是在使用pip,還是pip3在終端運行時,均會說此包已存在,但存在路徑均為python3.6下,所以嘗試更改regression.py文件的頭部第一行,更改為: #!/usr/bin/env python3
可以正常運行了!!!!
還是開心的曬一下,結果吧。(雖然和腳本無關了,哈哈哈哈哈)

對於使用shell腳本,傳遞參數,後續進行學習總結,今天就總結好編寫shell腳本運行python文件吧!

Ⅲ python執行shell命令

Python執行Linux系統命令,即在Python腳本中調用Shell命令,具體有以下四種方法:

1、os.system

//僅僅在一個子終端運行系統命令,而不能獲取命令執行後的返回信息
system(command)->exit_status
Executethecommand(astring)inasubshell.
//如果再命令行下執行,結果直接列印出來:
>>>os.system('ls')
04101419778.CHMbashdocumentmediapy-djangovideo
11.
all-

2、os.popen

//該方法不但執行命令還返回執行後的信息對象
popen(command[,mode='r'[,bufsize]])->pipe
Openapipeto/.

3、使用模塊 subprocess

>>>importsubprocess
>>>subprocess.call(["cmd","arg1","arg2"],shell=True)
//獲取返回和輸出:
importsubprocess
p=subprocess.Popen('ls',shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
forlineinp.stdout.readlines():
printline,
retval=p.wait()

4、使用模塊 commands

>>>importcommands
>>>dir(commands)
['__all__','__builtins__','__doc__','__file__','__name__','getoutput','getstatus','getstatusoutput','mk2arg','mkarg']
>>>commands.getoutput("date")
'WedJun1019:39:57CST2009'
>>>
>>>commands.getstatusoutput("date")
(0,'WedJun1019:40:41CST2009')

Ⅳ python 調用shell命令是非同步的么

代碼如下:
output = os.popen('cat /proc/cpuinfo')
print output.read()
通過 os.popen() 返回的是 file read 的對象,對其進行讀取 read() 的操作可以看到執行的輸出。但是無法讀取程序執行的返回值)
嘗試第三種方案 commands.getstatusoutput() 一個方法就可以獲得到返回值和輸出,非常好用。

Ⅳ shellwhile調用python執行一次就退出了

shellwhile調用python執行一次就退出了原因如下。
1、腳本是不能正常執行,會出現執行一次循環直接退出的情況。
2、使用for循環代替while循環,如下代碼片段既可以避免出現循環執行一次直接退出的問題。

Ⅵ 我希望通過Python腳本實現多次執行shell命令

python腳本實現多次循環執行shell命令有三種方法,代碼如下:

#方法一
os.system
importos
i=0
whileTrue:
i=i+1
os.system("tcpreplay-ibond0-M5-l1oracle_request_response.cap")
print"+++++++++++++++++++++++++++++++"
print"times:",i
time.sleep(5)

#方法二
os.popen
importos
i=0
whileTrue:
i=i+1
printos.popen("tcpreplay-ibond0-M5-l1oracle_request_response.cap").read()
print"+++++++++++++++++++++++++++++++"
print"times:",i
time.sleep(60)

#方法三
output=Popen("xxx",shell=True).communicate()[0]
importos
fromsubprocessimport*
i=0
whileTrue:
i=i+1
output=Popen("tcpreplay-ibond0-M5-l1oracle/*",shell=True).communicate()[0]
print"+++++++++++++++++++++++++++++++"
print"times:",i
time.sleep(60)
熱點內容
java協程框架 發布:2024-11-07 16:30:55 瀏覽:379
預測擬合演算法 發布:2024-11-07 16:30:45 瀏覽:663
橙光原始密碼是多少 發布:2024-11-07 16:24:33 瀏覽:34
安卓電話密碼是什麼 發布:2024-11-07 16:14:44 瀏覽:317
戰網客戶端文件夾 發布:2024-11-07 16:02:42 瀏覽:123
我的世界伺服器轉賬點券的指令 發布:2024-11-07 15:57:34 瀏覽:267
馬桶解壓 發布:2024-11-07 15:57:32 瀏覽:890
手機游戲蘋果和安卓哪個好 發布:2024-11-07 15:55:36 瀏覽:701
python數據處理pdf 發布:2024-11-07 15:55:33 瀏覽:696
織夢58阿里雲伺服器 發布:2024-11-07 15:53:44 瀏覽:823