communicatepython
A. python Popen communicate 和wait使用上的區別
使用 subprocess 模塊的 Popen 調用外部程序,如果
stdout 或 stderr 參數是 pipe,並且程序輸出超過操作系統的 pipe size時,如果使用
Popen.wait() 方式等待程序結束獲取返回值,會導致死鎖,程序卡在wait() 調用上。
B. python 調用subprocess communicate
方法 string dir = basename(fullPath); if(!_fileUtils->isDirectoryExist(dir)) { if(!_fileUtils->createDirectory(dir)) { // Failed to create directory CCLOG("AssetsManagerEx : can not create directory %s\n", fullPath.c_str()); un...
C. Python Popen communicate 和wait使用上的區別
開機按F1才能進入(啟動)系統的解決方法
1、BIOS ROM check sum error,System halted
(BIOS信息進行總和校驗時發現錯誤,系統鎖定)
解決方案:這個錯誤是一般人不會遇到的,這種信息多半是對主板BIOS刷新不完整才會出現的,惟一的處理方式就是重新刷新BIOS,但不能保證一定成功。
2、CMOS battery failed
(CMOS電池失效)
解決方案:這說明CMOS電池已經沒電了,只要將主板上的鈕扣電池取下,換一塊新電池即可。大部分主板都是使用3V的鈕扣電池,你可別將5V的電池買回來哦!你只要仔細查看電池的表面就可以清楚地看到上面標示「3V」的字樣。
3、CMOS check sum error-Defaults loaded
(CMOS執行全部檢查時發現錯誤,要載入系統預設值)
解決方案:這種情況通常是因為電池電力不足所造成,建議先換個電池看看。如果問題還是沒有解決,那麼說明CMOS RAM可能而問題,因為CMOS RAM我們個人是無法維修的,如果主板還在保修期內請聯系主板廠商或購買地的經銷商處理。
4、Display switch is set incorrectly
(顯示開關配置錯誤)
解決方案:只要你的主板不是老掉牙的,就肯定不會出現這個信息。一般來說,老主板上有一個路線用來設置屏幕為單色或彩色。出現此信息表示主板上的設定和CMOS設置不一致,所以只要判斷主板和CMOS設置誰為正確,然後更新錯誤的設置即可。
5、Floppy disk(s) fail或Floppy disk(s) fail (80)或Floppy disk(s) fail (40)
(軟碟機檢測失敗)
解決方案:應檢查軟碟機的數據線是否已正確連接,看看有沒有反接或松脫。別告訴我,電源插頭沒有接上哦!如果沒有軟碟機的話,建議在CMOS Setup程序中將「Drive A」設置為「None」。建議找個好軟碟機來試接一下。以證明原來的軟碟機是否有問題。
6、Hard disk(s) diagnosis fail
(執行硬碟診斷時發生錯誤)
解決方案:出現這個信息一般就是說硬碟本身出現故障了。你可以把硬碟接到別的電腦上試試看。如果問題還是沒有解決,那可能是這塊硬碟出現嚴重的物理故障了。
7、Hard disk(s) install failure
(硬碟安裝失敗)
解決方案:檢查硬碟的電源線或數據線是否正確接上。如果同一條IDE數據線上持接兩個IDE設備的跳線設置都一樣的話,只要將這兩個IDE設備的跳線設置不一樣即可(一般將主硬碟設為Master,另一個設為Slave)。
8、Hard disk(s) initializing (Please wait a moment…)
(正在對硬碟初始化,請稍等片刻)
解決方案:這種信息在較新的硬碟上根本看不到,但在較老的硬碟上,因為速度較慢,所以就會看到這個信息。
9、Hardware Monitor found an error,enter POWER MANAGEMENT SETUP for datails,Press F1 to continue,DEL to enter SETUP
(監視功能發現錯誤,進入「POWER MANAGEMENT SETUP」查看詳細資料,按F1鍵繼續開機程序,按DEL鍵進入CMOS設置)
解決方案:有的主板具備硬體的監測功能,可以設定主板與CPU的溫度監測、電壓調整器的電壓輸出准位監測和對各個風扇轉速的監測,當上述監測功能在開機時發覺有異常情況才會出現這個信息,這時可以進入CMOS設置,查看「POWER MANAGEMENT SETUP」中哪方面出現異常,然後加以解決。
10、Keyboard error or no keyboard present
(鍵盤錯誤或者未接鍵盤)
解決方案:檢查一下鍵盤的連線是否松動或者損壞,一些品質較次的鍵盤往往很容易出現此信息。
11、Memory test fail
(內存檢測失敗)
解決方案:通常這種情形是因為內存不兼容或故障所致。建議你重新插拔一下內存條,也許是因為內存條間互相不兼容。建議以每次開機一條內存的方式分批測試,找出故障的內存,把它拿掉或送修即可。
12、Override enable-Defaults loaded
(當前CMOS設定無法啟動系統,載入BIOS中的預設值以便啟動系統)
解決方案:一般是在CMOS設置內的設置出現錯誤才會出現此信息,只要重新進入CMOS設置選擇「Load Setup Defaults」載入系統原來的設定值,然後重新啟動即可。
13、Press TAB show POST screen
(按TAB鍵可以切換屏幕顯示)
解決方案:有些主板廠商會以自己設計的開機顯示畫面來取代BIOS預設的開機顯示畫面,而此信息是要告訴用戶可以按「TAB」鍵把廠商自己設計的開機顯示畫面和BIOS預設的開機顯示畫面進行切換。
14、Press ESC to skip memory test
(正在進行內存檢測,可按下ESC鍵跳過)
解決方案:當然你也可以按ESC鍵結束內存檢測,或者等待檢測通過。如果你不想等待的話,進入CMOS設置後選擇「BIOS Features Setup」,將其中的「Quick Power On Self Test」設為「Enabled」,儲存後重新啟動即可。
15、Primary master hard fail或Primary slave hard fail或Secondary master hard fail或Secondary slave hard fail
(檢測硬碟失敗)
解決方案:可能是CMOS設置不當,比如說沒有從盤但在CMOS設置里設為有從盤,那麼就會出現錯誤,這時可以進入CMOS設置對硬碟進行自動檢測,也可能是硬碟的電源線,數據線可能未接好或者硬碟跳線設置不當。
16、Resuming from disk,Press TAB to show POST screen
(從硬碟恢復開機,按TAB顯示開機自檢畫面)
解決方案:這是因為有些主板的BIOS提供了「Suspend to disk(將硬碟掛起)」的功能,如果我們用Suspend to disk的方式來關機,那麼我們在下次開機時就會顯示此提示消息
D. python communicate()方法怎麼讀取不到數據
供參考,py3代碼運行通過,py2可能不需要調用encode
fromsubprocessimportPopen,PIPE
child=Popen('adbshell',stdin=PIPE,stdout=PIPE,shell=True)
output=child.communicate(input="ls-l".encode())
print(output)
E. Python Popen communicate 和wait使用上的區別
#!/usr/bin/env python
# coding: utf-8
# yc@2013/04/28
import subprocess
def test(size):
print 'start'
cmd = 'dd if=/dev/urandom bs=1 count=%d 2>/dev/null' % size
p = subprocess.Popen(args=cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
#p.communicate()
p.wait()
print 'end'
# 64KB
test(64 * 1024)
# 64KB + 1B
test(64 * 1024 + 1)
F. Python Popen communicate 和wait使用上的區別
簡單說就是,使用subprocess模塊的Popen調用外部程序,如果stdout或stderr參數是pipe,並且程序輸出超過操作系統的pipesize時,如果使用Popen.wait()方式等待程序結束獲取返回值,會導致死鎖,程序卡在wait()調用上。ulimit-a看到的pipesize是4KB,那隻是每頁的大小,查詢得知linux默認的pipesize是64KB。看例子:#!/usr/bin/envpython#coding:utf-8#yc@2013/04/28importsubprocessdeftest(size):print'start'cmd='ddif=/dev/urandombs=1count=%d2>/dev/null'%sizep=subprocess.Popen(args=cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT,close_fds=True)#p.communicate()p.wait()print'end'#64KBtest(64*1024)#64KB+1Btest(64*1024+1)首先測試輸出為64KB大小的情況。使用dd產生了正好64KB的標准輸出,由subprocess.Popen調用,然後使用wait()等待dd調用結束。可以看到正確的start和end輸出;然後測試比64KB多的情況,這種情況下只輸出了start,也就是說程序執行卡在了p.wait()上,程序死鎖。具體輸出如下:startendstart那死鎖問題如何避免呢?官方文檔里推薦使用Popen.communicate()。這個方法會把輸出放在內存,而不是管道里,所以這時候上限就和內存大小有關了,一般不會有問題。而且如果要獲得程序返回值,可以在調用Popen.communicate()之後取Popen.returncode的值。結論:如果使用subprocess.Popen,就不使用Popen.wait(),而使用Popen.communicate()來等待外部程序執行結束。Popen.wait()¶..=PIPEand/orstderr=.Usecommunicate()toavoidthat.Popen.communicate(input=None)¶Interactwithprocess:Senddatatostdin.Readdatafromstdoutandstderr,untilend-of-fileisreached.Waitforprocesstoterminate.,orNone,.communicate()returnsatuple(stdoutdata,stderrdata).』sstdin,=PIPE.Similarly,,youneedtogivestdout=PIPEand/orstderr=PIPEtoo.,.subprocess的兩種方法:1)如果想調用之後直接阻塞到子程序調用結束:.,youcanjustusesubprocess.call.#.call([data["om_points"],">",diz['d']+"/points.xml"])2)非阻塞的時候方式:,.#startandprocessthings,thenwaitp=subprocess.Popen(([data["om_points"],">",diz['d']+"/points.xml"])print"Happenswhilerunning"p.communicate()#,waitcandeadlock,socommunicateisadvisable.
G. Python Popen communicate 和wait使用上的區別
官方文檔里推薦使用 Popen.communicate()。這個方法會把輸出放在內存,而不是管道里,所以這時候上限就和內存大小有關了,一般不會有問題。而且如果要獲得程序返回值,可以在調用Popen.communicate() 之後取 Popen.returncode 的值。
結論:如果使用 subprocess.Popen,就不使用 Popen.wait(),而使用 Popen.communicate() 來等待外部程序執行結束。