从命令行运行python程序并指定参数

时间:2017-06-24 20:09:21

标签: python

我有一个定义了几个函数的文档(assignment_2a.py)。我试图实现以下目标:

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运行这个指定的函数,它工作正常。但是如何更改文档以便我可以使用上面的命令从命令行运行它,即以该格式指定输入变量?

更新:我按照评论中的建议更新了该功能,并收到以下错误消息:

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:])

3 个答案:

答案 0 :(得分: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

拥有更多或更少的参数会引发错误。

答案 1 :(得分: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 :(得分:0)

正如其他人(以及您自己)所指出的,您需要使用sys.argv

以下是main()函数的外观:

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)

这会强制您在每次调用make_random_story时输入所有3个参数。这有点明确,并允许您在需要时进行参数的完整性检查。我也认为这有点容易阅读,但打电话也比较麻烦。

请参阅@Alex Hall的答案以获得更大的灵活性。