2014-01-13 144 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