我遇到一个问题,即使用python子进程模块执行的unix命令被卡住了: (完整代码在这里: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/func.py)
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)
sort命令的输入文件(也是输出文件)为空。在调用此命令之前,该文件不为空(打印出来)。
问题是,如果这是一个python问题,该文件怎么可能是空的。 (一个假设是这个python 2.7 bug:http://bugs.python.org/issue19809)。
在排序过程中发出strace表明它被困在futex上。不幸的是,我无法重现此问题,我没有输入文件。当手动杀死排序过程时,它返回(当然有错误)。
我正在使用gnu coreutils 8.10
答案 0 :(得分:0)
这不是一个python问题,因为它都发生在子shell中,Python并不认为它是一个文件名。
实际上,sort
命令输出其输出文件以进行写入并清空它。如果它同时是输入文件,则会丢失。
解决方案可能是将所有内容输出到临时文件中,然后重命名。