2012-10-31 225 views
0

完整的新手问题。解析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

尝试打印出'sys.argv';它可能不是你所期望的。我不确定它在Windows中的具体情况,但在任何'sh'兼容的shell中,它将是'['m.py','Clockwork Orange','year = 1971']'。 – abarnert

+0

PS,问题标题有误导性。在这两种情况下,您都没有写过类,并且在这两种情况下您都使用同一个类('moviesearch.MovieSearch'),所以这不是“类与脚本”。这实际上是关于如何解析命令行参数。 – abarnert

+0

感谢您的提示。改变了标题。 –

回答

5

当您在外壳做到这一点(我假设* nix的平台,兼容sh的外壳;的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 = dict(pair.split('=') for pair in argv[2:]) 
result = movie_db.search(movie_name, **params) 

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

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

+0

这样做。谢谢你的一切! –