Stdin无法正常工作[Python]

时间:2017-03-14 00:31:19

标签: python stdin

我现在正在使用Python进行一些练习,包括一个可以从命令行或stdin获取输入的简单行计数器:

#### line_count1.py ####

import sys

def count_lines(file):
    n = 0
    for line in file:
        n = n + 1
    return n

if len(sys.argv) == 1:
    print("Needs stdin")
    file = sys.stdin
else:
    print("File given at command line")
    file = open(sys.argv[1])

print (count_lines(file))

如果我在命令行输入文件,即 python line_count1.py file_with_4_lines.txt ,它的效果很好,我得到了输出:

File given at command line
4

但是,如果我输入它以便通过 python line_count1.py 需要stdin,我会得到以下输出:

Needs stdin
_

但是从来没有对我的stdin条目做任何事情。我可以输入 file_with_4_lines.txt ,但是它只需要它并等待我输入另一个stdin行,永远不会爆发,直到我必须杀死任务管理器中的代码。

导致这种情况发生的原因是什么?根据我的理解,只要我输入stdin的内容就应该触发其余的代码。但事实并非如此。我错过了什么?

2 个答案:

答案 0 :(得分:1)

这与您的代码无关,但与终端上的npm install @angular/compiler-cli @angular/platform-server --save node_modules/.bin/ngc -p tsconfig-aot.json //Windows users should surround the ngc command in double quotes: "node_modules/.bin/ngc" -p tsconfig.json 读取行为有关。有关详细信息,请参阅以下帖子:https://unix.stackexchange.com/questions/16333/how-to-signal-the-end-of-stdin-input

编辑: 正如@Chase所说,在窗口上终止stdin的关键是stdin,在linux上它是Ctrl+Z

答案 1 :(得分:1)

听起来你想接受来自stdin的文件名,如果没有在命令行中给出,那么你现在所做的就是试图计算stdin本身。

如果目标是处理给定文件,其名称来自stdin或命令行,则代码应更改为:

if len(sys.argv) == 1:
    # Prompt for and read a single line from stdin to get the desired file name
    filename = input("Needs stdin")  # On Py2, use raw_input, not input
else:
    print("File given at command line")
    # Use argument as filename
    filename = sys.argv[1]

# Open the name provided at stdin or command line
# Use with statement so it's properly closed when you're done
with open(filename) as file:
    print(count_lines(file))