2017-03-14 10 views
0

私は、コマンドラインまたは標準入力からの入力を取ることができ、簡単なラインカウンタを含め、今Pythonでいくつかの演習を通じて実行しています:標準入力[Pythonの]

#### 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、私は次の出力を得る:

Needs stdin 
_ 

しかし、実際には私のstdinのエントリでは何もしません。私はfile_with_4_lines.txtと入力することができますが、タスクマネージャーでコードを強制終了するまで、決してそれを取り出して別の標準入力を待つことはありません。

これは何が起こる原因ですか?私の理解から、私がstdinのために何かを入力するとすぐに、残りのコードを実行する必要があります。しかし、そうではありません。私は何が欠けていますか?

+0

あなたはそれが 'の内容を読み取るために期待しています'file_with_4_lines.txt'を' stdin'の場合 'file_with_4_lines.txt'と入力するとファイルがありますか?これは 'stdin'の仕組みではありません... – ShadowRanger

+0

ファイル変数をstdinと同じにしてcount_lines(file)で使用します。 – Chase

答えて

1

これはあなたのコードとは関係ありませんが、端末での読み取りの動作はstdinと関連しています。詳細については、次の記事を参照してください:https://unix.stackexchange.com/questions/16333/how-to-signal-the-end-of-stdin-input

EDIT: @Chaseが言っているように、ウィンドウでstdinを終了する鍵はCtrl+Zで、LinuxではCtrl+Dです。

+0

これは解決していないようですが、file_with_4_lines.txtを入力してください^ Dはstdinを終了せず、file_with_4_lines.txtを、次に^ Dを次の行に出力しません。 – Chase

+0

未来の読者に:問題は私がWindowsであり、Linuxではないということでした。 WindowsはCtrl + Zで終了し、Ctrl + Dでは終了しません。 – Chase

0

コマンドラインで与えられていない場合はどのようなあなたが今やっていることは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)) 
関連する問題