【问题标题】:Run python program from command line and specify arguments从命令行运行 python 程序并指定参数
【发布时间】:2017-06-30 21:44:24
【问题描述】:

我有一个定义多个函数的文档(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 来运行这个指定的函数,它运行良好。但是如何更改文档以便我可以使用上述命令从命令行运行它,即以该格式指定输入变量?

更新:我按照 cmets 中的建议更新了函数,并收到以下错误消息:

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

【问题讨论】:

标签: python


【解决方案1】:

在您的情况下,这非常简单。以下是您可以如何使用 n_gram 和 num_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

而且有更多或更少的参数都会引发错误。

【讨论】:

  • 感谢您的回复!我进行了您编写的更改,但是当我尝试从命令行运行时,现在出现以下错误: Traceback(最近一次调用最后一次):文件“assignment_2a.py”,第 201 行,在 make_random_story( *sys.argv[1:]) 文件“assignment_2a.py”,第 189 行,make_random_story for i in xrange(0,num_words): TypeError: an integer is required
【解决方案2】:

使用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

【讨论】:

    【解决方案3】:

    正如其他人(和您自己)指出的那样,您需要使用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 的答案以获得更多灵活性。

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-12
      • 2020-04-26
      • 2020-05-09
      相关资源
      最近更新 更多