【问题标题】:Why is redirecting script's output to a file giving an incorrect output?为什么将脚本的输出重定向到给出错误输出的文件?
【发布时间】:2019-01-27 21:03:20
【问题描述】:

这是python脚本sum_columns.py

#!/usr/bin/env python2.7

import sys

num_nodes = 0
num_edges = 0

for line in sys.stdin:
   line = line.strip()
   col_1, col_2 = line.split(',', 1)

   col_1 = int(col_1)
   col_2 = int(col_2)

   num_nodes += col_1
   num_edges += col_2

print '%s, %s' % (num_nodes, num_edges)

有一个名为 outputs.dat 的文件只有 1 行:

10, 10

我试图将 python 脚本的输出重定向到输入文件outputs.dat,但是当我这样做时,它会写出0, 0,而我期待10, 10。当我重定向到另一个未命名为outputs.dat 的文件时,我得到10, 10。为什么会这样?

这是我正在执行的命令。

[local_serv]$ cat outputs.dat
10, 10
[local_serv]$ cat outputs.dat | ./sum_columns.py 
10, 10
[local_serv]$ cat outputs.dat | ./sum_columns.py > test.dat; cat test.dat
10, 10
[local_serv]$ cat outputs.dat | ./sum_columns.py > outputs.dat; cat outputs.dat
0, 0
[local_serv]$ 

我的理解是>重写了outputs.dat(如果已经存在的话),为什么python脚本打印10, 10时会重写为0, 0

【问题讨论】:

    标签: python shell redirect


    【解决方案1】:

    我的理解是>重写outputs.dat(如果已经存在的话),

    是的,确切地说,它会截断文件。

    当python脚本打印10, 10时,为什么要重写为0, 0

    它不会打印出来。 Python 脚本 读取 文件的内容以根据其内容执行一些计算,但是 > 截断 文件,所以当 Python 读取其内容时,它是空的.

    【讨论】:

    • 好像漏掉了这里的操作顺序。你是说python脚本是在>执行后执行的?
    • 是的。 > 表示脚本以连接到outputs.dat 的标准输出流启动。在此之前,文件将被截断。
    • 啊,我不知道。我以为linux终端中的操作顺序总是从左到右。
    • 如果文件未连接到输出在脚本启动之前,脚本的输出如何在文件中结束?如果脚本首先打印一些东西怎么办?如果脚本测试标准输出是文件还是终端,然后根据它做不同的事情怎么办?唯一可行的方法是,如果标准输出在命令启动之前被重定向。
    • 哦。我完全错过了。在 Python 脚本中,我将 print 命令放在程序的最后,所以我认为 shell 在看到第一个 print 命令时会打开输出文件进行写入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2017-08-31
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多