2014-01-13 142 views
0

我在那裏與蟒蛇子模塊執行的UNIX命令把一個問題: (完整的代碼是在這裏: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/func.pyPython的子命令執行卡住了

Unix命令是就地簡單分類。 創建過程的方法:

env = os.environ.copy() 
env['LC_ALL'] = 'C' 
cmd, shell = sort_cmd(filename, sort_buffer_size) 
subprocess.check_call(cmd, env=env, shell=shell) 

其中sort_cmd是:

def sort_cmd(filename, sort_buffer_size): 
    return (r"sort -z -t$'\xff' -k 1,1 -T . -S {0} -o {1} {1}" 
     .format(sort_buffer_size, filename), True) 

排序命令的輸入文件(其也是輸出文件)是空的。調用該命令之前該文件不是空的(它被打印)。

問題是,如果這是一個python問題,該文件如何爲空。 (一個假設是這個Python 2.7的bug:http://bugs.python.org/issue19809)。

在排序過程中發佈strace表明它被困在futex上。不幸的是,我還沒有能夠重現這個問題,我沒有輸入文件。當排序過程手動終止時,它返回(當然有一個錯誤)。

我使用GNU的coreutils 8.10

回答

0

這不可能是一個Python的問題,因爲這一切從子shell中發生,Python有沒有概念,這是任何一個文件名。

實際上,sort命令輸出其輸出文件進行寫入並將其清空。如果它是同時輸入文件,則會丟失。

解決方案可能是將所有內容輸出到臨時文件中,然後重命名。

+0

使用臨時文件並不是最好的解決方案,因爲我們必須對磁盤使用情況保守。排序命令保證讀取所有內容,然後開始寫入文件。這可能是GNU排序的問題,但我沒有足夠的證據來排除python的bug。另外,鑑於排序不是以並行模式發佈的,我不知道它需要什麼樣的鎖。 –

+0

@ShayanPooya也許它開始寫得很晚,但很明顯,這個文件很早就被清空了。所有的Python都會發出系統命令。如上所述,它沒有關於訪問文件的概念。那該怎麼辦? – glglgl