Python子进程命令执行陷入停滞

Python子进程命令执行陷入停滞,python,linux,python-2.7,subprocess,gnu-coreutils,Python,Linux,Python 2.7,Subprocess,Gnu Coreutils,我遇到一个问题,即使用python子流程模块执行的unix命令被卡住: (完整代码如下: ) unix命令是一种简单的就地排序。 创建流程的方式: 其中,sort_cmd为: sort命令的输入文件(也是输出文件)为空。调用此命令之前,文件不是空的(已打印) 问题是,如果这是一个python问题,文件怎么可能是空的。(一个假设是python 2.7错误:) 在分拣过程中发出strace显示它被卡在futex上。不幸的是,我无法重现这个问题,并且我没有输入文件。当手动终止排序进程时,它返回(当然有

我遇到一个问题,即使用python子流程模块执行的unix命令被卡住: (完整代码如下: )

unix命令是一种简单的就地排序。 创建流程的方式:

其中,sort_cmd为:

sort命令的输入文件(也是输出文件)为空。调用此命令之前,文件不是空的(已打印)

问题是,如果这是一个python问题,文件怎么可能是空的。(一个假设是python 2.7错误:)

在分拣过程中发出strace显示它被卡在futex上。不幸的是,我无法重现这个问题,并且我没有输入文件。当手动终止排序进程时,它返回(当然有一个错误)


我使用的是gnu coreutils 8.10,这不可能是python的问题,因为这一切都发生在子shell中,python根本不知道它是一个文件名

实际上,
sort
命令输出其输出文件以供写入并清空。如果同时是输入文件,则会丢失


一个解决方案是将所有内容输出到一个临时文件中,然后重命名该文件。

使用临时文件不是最佳解决方案,因为我们必须保守磁盘使用情况。sort命令保证读取所有内容,然后开始写入文件。这可能是gnu排序的问题,但我没有足够的证据来排除python bug。另外,由于排序不是以并行模式发出的,我没有得到它需要的锁。@ShayanPooya可能它开始写得很晚,但显然,文件很早就被清空了。Python所做的只是发出一个系统命令。如前所述,它不知道如何访问文件。那么它应该怎么做呢?
env = os.environ.copy()
env['LC_ALL'] = 'C'
cmd, shell = sort_cmd(filename, sort_buffer_size)
subprocess.check_call(cmd, env=env, shell=shell)
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)