解析python命令行参数

时间:2012-10-31 21:07:29

标签: python

完成新手问题。

我正在开发一个使用API​​搜索电影数据库的课程。

以下是使用Python解释器中的电影标题和年份进行查询的方法:

import moviesearch

movie_db = moviesearch.MovieSearch()
result = movie_db.search('Clockwork Orange', year='1971')
print result

执行此特定查询会产生我正在使用的服务的一个结果。

为了保存测试类型,我创建了以下脚本m.py:

from sys import argv
import moviesearch

script, movie_name, params = argv

movie_db = moviesearch.MovieSearch()
result = movie_db.search(movie_name, params)
print result

当我像这样执行这个脚本时:

python m.py 'Clockwork Orange', year='1971'

该服务产生两个结果。

所以这意味着当我使用脚本测试类时,我格式化参数的方式有问题。有人可以告诉我我做错了吗?

我不包括查询电影数据库的课程,因为我认为没有必要弄清楚什么是错的。我需要知道的是如何在使用脚本时正确格式化我的参数,以便它完全像上面的例子中那样执行,我在Python解释器中直接使用该类。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

当你在shell中执行此操作时(我假设一个带有sh兼容shell的* nix平台; Windows可能略有不同):

python m.py 'Clockwork Orange', year='1971'

sys.argv列表将是:

['m.py', 'Clockwork Orange,', 'year=1971']

所以,当你这样做时:

script, movie_name, params = argv

最终,movie_name设置为字符串'Clockwork Orange,'(带有额外的逗号),params设置为字符串'year=1971'。所以,你的电话最终是:

result = movie_db.search('Clockwork Orange,', 'year=1971')

这与以下内容不同:

result = movie_db.search('Clockwork Orange', year='1971')

那么,你如何得到你想要的东西?

好吧,你可以解析params,代码如下:

params = dict(pair.split('=') for pair in argv[2:])
result = movie_db.search(movie_name, **params)

第一行会为您dict提供{'year': '1971'}。然后,您可以使用**语法将dict转发为函数的关键字参数。

最后,您应该在用于运行脚本的参数中取出额外的逗号。 (您可以编写代码来删除它,但看起来它只是一个错字,所以更好的解决方法是不要输入错误。)