在python子流程中使用tail需要很长时间

在python子流程中使用tail需要很长时间,python,Python,我正在尝试在我的研究项目中使用多重处理。由于多个进程将同时读取同一个大文件,因此我尝试使用tail在每个进程的特定范围内复制它。具体代码如下所示 python 结果=子进程调用([“tail”、“-n”、“+”+str(跳过+1)、解析文件“>”、跳过的文件),shell=True) 结果显示为0,这应该已经完成。但是没有我想要生成的跳过文件。我还尝试在python控制台中编写代码,但我必须中断它,这需要花费很长时间 有人有什么想法吗?您的代码挂起,因为它正在等待stdin上的EOF,而根本不

我正在尝试在我的研究项目中使用多重处理。由于多个进程将同时读取同一个大文件,因此我尝试使用tail在每个进程的特定范围内复制它。具体代码如下所示
python
结果=子进程调用([“tail”、“-n”、“+”+str(跳过+1)、解析文件“>”、跳过的文件),shell=True)
结果显示为0,这应该已经完成。但是没有我想要生成的跳过文件。我还尝试在python控制台中编写代码,但我必须中断它,这需要花费很长时间


有人有什么想法吗?

您的代码挂起,因为它正在等待stdin上的EOF,而根本不读取
解析文件

取出
shell=True
可修复此问题:

result = subprocess.call(["tail", "-n", "+" + str(skip+1), resolution_file],
                         stdout=open(skipped_file, 'w'))

…现在,为什么它会这样?因为
shell=True
['sh','-c']
前置到参数列表中。因此,您的原始代码实际上执行了以下操作:

result = subprocess.call(["sh", "-c", "tail", "-n", "+" + str(skip+1), resolution_file, ">", skipped_file])
有什么作用呢?嗯,它运行
sh-c'tail'
,shell脚本
tail
可以使用后续参数。除了那个脚本根本不看它的其他参数,所以它们被忽略了。当它没有传递任何参数时,
tail
只是在stdin上等待EOF。。。在目前的情况下,一个永远不会到来的人


那么,如果您想使用
shell=True
,并从shell内部而不是从Python代码中打开输出文件,该怎么办?在这种情况下,您可以这样编写代码:

result = subprocess.call([
  'tail -n +"$1" -- "$2" >"$3"', '_',   # script itself, then $0 it's run with
  str(skip+1),                          # this is $1 for the script
  resolution_file,                      # ...its $2...
  skipped_file                          # ...and its $3
], shell=True)

除了第一个论点,这里什么都忽略了。当您对列表使用
shell=True
时,第一个列表元素是唯一解析为shell脚本的元素。在脚本运行的上下文中,后续列表元素是
$0
$1
,等等。