亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 5252 | 回復(fù): 6
打印 上一主題 下一主題

os.system(sort)疑惑 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-05-23 19:09 |只看該作者 |倒序?yàn)g覽
python程序需要調(diào)用如下的sort命令:

sort -t@ -rink1 /data1/admatch//datamanager/logAna//his//maxRate/stats/20080523/1_max_rate.dat.tmp -T /data2/search/.SortTmp/|head -n100 > /data1/admatch//datamanager/logAna//his//maxRate/stats/20080523/1_max_rate.dat

python執(zhí)行的時(shí)候經(jīng)常會(huì)輸出如下的錯(cuò)誤:
sort: write failed: -: Broken pipe

其中,1_max_rate.dat.tmp  117KB
不知道為什么會(huì)出現(xiàn)這個(gè)錯(cuò)誤;如果我在shell手動(dòng)調(diào)用這個(gè)sort命令,則不會(huì)出現(xiàn)錯(cuò)誤。
先謝謝各位了!

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-05-26 10:55 |只看該作者
up一下!呵呵

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-05-27 15:05 |只看該作者
看到你在shell版發(fā)的帖子,發(fā)出了這樣的感慨:
但我個(gè)人覺得:如果在shell腳本里遇到,數(shù)據(jù)量大,計(jì)算量也大的應(yīng)用的時(shí)候,最好不要使用管道。存成臨時(shí)文件會(huì)更安全
和強(qiáng)壯些。(個(gè)人想法,歡迎批評(píng)指正!)
其實(shí)這并不是管道的問題,使用管道反而會(huì)提高效率,就拿你的例子來說sort file |head -n 100,如果file這個(gè)文件很大,而head只需要前100行就夠了,何必要把整個(gè)文件的內(nèi)容都寫入管道呢,這不是多此一舉嘛。
對(duì)于管道來說寫一個(gè)讀斷已經(jīng)關(guān)閉的管道,會(huì)產(chǎn)生SIGPIPE信號(hào),在這里head讀完100行之后就結(jié)束了,sort再往管道里面寫就會(huì)接收到SIGPIPE信號(hào),而sort是不會(huì)顯示的處理信號(hào)的。在一個(gè)程序剛啟動(dòng)時(shí),會(huì)把在父進(jìn)程中設(shè)置為捕捉的信號(hào),設(shè)置為默認(rèn)動(dòng)作,設(shè)置為忽略的不做改變。在登錄shell中對(duì)于SIGPIPE的動(dòng)作是默認(rèn)動(dòng)作,也就是進(jìn)程結(jié)束。所以在終端下執(zhí)行sort這個(gè)命令接收到SIGPIPE信號(hào)時(shí),進(jìn)程就直接退出了,所以不會(huì)產(chǎn)生出錯(cuò)信息。當(dāng)然也不是正常結(jié)束的,只不過你看不到出錯(cuò)信息罷了。而python啟動(dòng)后,則會(huì)把SIGPIPE設(shè)置為忽略。在sort進(jìn)程中接收到此信號(hào)時(shí),也會(huì)忽略這個(gè)信號(hào),繼續(xù)執(zhí)行。然后sort發(fā)現(xiàn)write的返回值為-1,就認(rèn)為產(chǎn)生了錯(cuò)誤,所以會(huì)打印出錯(cuò)信息。
你可以做一個(gè)實(shí)驗(yàn),在python中import singal,然后signal.singal(signal.SIGPIPE,signal.SIG_DFL),把SIGPIPE設(shè)置為默認(rèn)動(dòng)作,然后再執(zhí)行sort命令,你就不會(huì)看到出錯(cuò)信息了。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-05-27 22:55 |只看該作者
原帖由 ocean390 于 2008-5-27 15:05 發(fā)表
看到你在shell版發(fā)的帖子,發(fā)出了這樣的感慨:
但我個(gè)人覺得:如果在shell腳本里遇到,數(shù)據(jù)量大,計(jì)算量也大的應(yīng)用的時(shí)候,最好不要使用管道。存成臨時(shí)文件會(huì)更安全
和強(qiáng)壯些。(個(gè)人想法,歡迎批評(píng)指正!)
...


收藏。

不妨用os.popen().readline 讀100行出來。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-05-28 17:50 |只看該作者
ocean390的分析十分到位!
兄弟我學(xué)到很多東西!多謝!我當(dāng)時(shí)咋就沒想出來呢!
難怪我當(dāng)時(shí)在分析生成的文件的時(shí)候,發(fā)現(xiàn)結(jié)果是正確的。
另外從分析中我也覺得,利用broken pipe,也正是使用管道以提高效率的原因之一。

如此精辟之分豈能獨(dú)享!再up一下!

save as...

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-05-29 11:46 |只看該作者
原帖由 fufeiwxy 于 2008-5-28 17:50 發(fā)表
ocean390的分析十分到位!
兄弟我學(xué)到很多東西!多謝!我當(dāng)時(shí)咋就沒想出來呢!
難怪我當(dāng)時(shí)在分析生成的文件的時(shí)候,發(fā)現(xiàn)結(jié)果是正確的。
另外從分析中我也覺得,利用broken pipe ...







  1. import os
  2. import sys
  3. import time
  4. import traceback

  5. fifoname = '/tmp/pipefifo' # must open same name

  6. def child():
  7.         pipeout= os.open(fifoname, os.O_WRONLY) # open fifo pipe file as fd
  8.         zzz = 0
  9.         while True:
  10.                 try:
  11.                         time.sleep(zzz)
  12.                         os.write(pipeout, 'Spam %03d\n' % zzz)
  13.                 except OSError:
  14.                         exc_info = sys.exc_info()
  15. #                        print exc_info[0]
  16.                         print exc_info[1]
  17. #                        traceback.print_tb(exc_info[2])
  18.                         if str(exc_info[1])[-11:].lower() == 'broken pipe':
  19.                                 print 'Consumer had exited...'
  20.                                 lets_exit()
  21.                 except KeyboardInterrupt:
  22.                         os.write(pipeout,'Byebye\n')
  23.                         print 'Byebye message had sent...'
  24.                         lets_exit()
  25.                 else:
  26.                         zzz = (zzz+1) %5

  27. def lets_exit():
  28.         print 'OK, byebye'
  29.         sys.exit()


  30. def parent():
  31.         pipein = open(fifoname, 'r') # open fifo as stdio object
  32.         while True:
  33.                 try:
  34.                         line = pipein.readline()[:-1] # block until data sent
  35.                         if line:
  36.                                 print 'Parent %d got "%s" at %s' % (os.getpid(), line, time.time())
  37.                                 if line[:3].lower() == 'bye':
  38.                                         print 'Proceduer had exited...'
  39.                                         lets_exit()
  40.                 except  KeyboardInterrupt:
  41.                                 lets_exit()

  42. if __name__ == '__main__':
  43.         if not os.path.exists(fifoname):
  44.                 os.mkfifo(fifoname) # create a named pipe file
  45.         if len(sys.argv) == 1: # run as parent if no args
  46.                 parent()
  47.         else: # else run as child process
  48.                 child()
復(fù)制代碼

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-05-29 21:18 |只看該作者

回復(fù) #6 baif 的帖子

不太清楚要說明什么?
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP