2017-06-24 15 views
2

私はいくつかの関数を定義した文書を持っています(assignment_2a.py)。私は、次のことを達成しようとしている:コマンドラインからPythonプログラムを実行し、引数を指定する

Modify the [assignment_2a.py](../code/assignment_2a.py) to be able to run 
the program `make_random_story` from the command line: 

``` 
$ python assignment_2a.py '../data/alice.txt' 2 200 
``` 

私はipythonに行くことによって、この指定された関数を実行する方法を知っている、それが正常に動作します。しかし、上記のコマンドを使用してコマンドラインから実行できるように、つまりその形式で入力変数を指定するために、ドキュメントを変更するにはどうすればよいですか?

UPDATE:私はコメントで示唆したように機能を更新し、次のエラーメッセージを取得しています:

COMMAND LINE INPUT: 
python assignment_2a.py '../data/alice.txt' 2 200 

COMMAND LINE OUTPUT: 
Traceback (most recent call last): 
File "assignment_2a.py", line 202, in <module> 
make_random_story(*sys.argv[1:]) 
File "assignment_2a.py", line 189, in make_random_story 
for i in xrange(0,num_words): 
TypeError: an integer is required 

そしてここでは、関連する更新機能のテキストです:

def make_random_story(f, n_gram=2, num_words=200): 
    f = open(f) 
    random.seed('Is the looking-glass is half full or half-empty?') 
    story = '' 
    if n_gram==1: 
     d = associated_unigrams(f) 
    elif n_gram==2: 
     d = associated_bigrams(f) 
    elif n_gram==3: 
     d = associated_trigrams(f) 
    for i in xrange(0,num_words): 
     chosenkey = random.choice(d.keys()) 
     story += random.choice(d[chosenkey]) + " " 
    print story 
    f.close() 

if __name__ == '__main__': 
    make_random_story(*sys.argv[1:]) 
+1

[mcve]を作成してください。 'sys.argv'をリストとして出力してみてください...あなたは何を気付きますか? –

+0

この質問の回答を受け入れることを検討してください。https://stackoverflow.com/questions/44729412/creating-a-dictionary-for-each-word-in-a-file-and-counting-the-frequency-of-word –

答えて

1

使用sys.argv、それは非常に簡単です。スクリプト名はsys.argv[0]と指定しないでください。

make_random_story(sys.argv[1]) 

より良い提案があなたのケースでは、それは非常に簡単ですネイティブモジュールの使用argparse

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo', help='foo help') 
args = vars(parser.parse_args()) 
foo_param = args['foo'] #args is a dict and any Param can be accessed using the key 
2

が含まれます。ここでは、n_gramnum_wordsはオプションであるという事実を使用することができる方法だが、彼らはまだ位置引数として順に指定する必要があります。

if __name__ == '__main__': 
    make_random_story(*sys.argv[1:]) 

だから、次のすべてが同じようになります:

python assignment_2a.py '../data/alice.txt' 
python assignment_2a.py '../data/alice.txt' 2 
python assignment_2a.py '../data/alice.txt' 2 200 

引き数を増やすと、エラーが発生します。

+0

お返事ありがとうございます! 変更を加えましたが、今すぐコマンドラインから実行しようとすると、次のエラーが表示されます。 トレースバック(最新の最後の呼び出し): ファイル "assignment_2a.py"、201行目 make_random_story(* sys.argvの[1])はxrange(0、NUM_WORDS)におけるiについてmake_random_story におけるファイル "assignment_2a.py"、ライン189、: TypeError例外:整数が必要とされます – Kristie

0

他人(あなた自身)が指摘したように、sys.argvを使用する必要があります。

if __name__ == '__main__': 
    f = sys.argv[1] 
    n_gram = sys.argv[2] 
    num_words = sys.argv[3] 

    make_random_story(f, n_gram=n_gram, num_words=num_words) 

これは、あなたがすべての3つの引数あなたはmake_random_storyへの呼び出しを行うたびに出入力する強制:

はここにあなたのmain()機能がどのように見える必要がある方法です。これはもう少し明示的なもので、必要に応じて引数の健全性チェックを行うことができます。私はそれを読むのが簡単だと主張したいが、電話するのはもっと面倒だ。

@Alex Hallの回答を参照してください。

関連する問題