2012-08-12 37 views
1

我一直在尝试学习如何正确使用sys.argv,同时从命令行调用可执行文件。Python sys.argv打印函数结果的类型错误?

我想要在命令行传递文件名和参数时将函数结果打印到命令行,但是我得到一个TypeError。

到目前为止,我有:

#! /usr/bin/env python 
import mechanize 
from BeautifulSoup import BeautifulSoup 
import sys 

def dictionary(word): 
    br = mechanize.Browser() 
    response = br.open('http://www.dictionary.reference.com') 
    br.select_form(nr=0) 
    br.form['q'] = sys.argv 
    br.submit() 
    definition = BeautifulSoup(br.response().read()) 
    trans = definition.findAll('td',{'class':'td3n2'}) 
    fin = [i.text for i in trans] 
    query = {} 
    for i in fin: 
     query[fin.index(i)] = i 
    return query 

print dictionary(sys.argv) 

当我把这叫做:

./this_file.py 'pass' 

我离开我与此错误消息:

Traceback (most recent call last): 
    File "./hot.py", line 20, in <module> 
    print dictionary(sys.argv)  
    File "./hot.py", line 10, in dictionary 
    br.form['q'] = sys.argv 
    File "/usr/local/lib/python2.7/dist-packages/mechanize/_form.py", line 2782, in __setitem__ 
    control.value = value 
    File "/usr/local/lib/python2.7/dist-packages/mechanize/_form.py", line 1217, in __setattr__ 
    raise TypeError("must assign a string") 
TypeError: must assign a string 

回答

4

随着

br.form['q'] = sys.argv

您正在分配一个字符串列表这里是而不是的一个字符串。

>>> type(sys.argv) 
<type 'list'> 
>>> type(sys.argv[0]) 
<type 'str'> 
>>> 

你想确定一个特定的字符串通过索引分配。

最有可能它会是索引1给你什么你的帖子(并且因为索引0是脚本的名称)。因此,也许

br.form['q'] = sys.argv[1]

会为你做。当然,它也可能是另一个索引,取决于您的特定应用/需求。

注意@Dougal在下面的有用注释中注意到,该函数中的函数参数word未被使用。你正在呼叫你的dictionary函数发送它sys.argv,然后应该参考word里面的函数。该类型不会仅更改在函数内引用命令行参数的名称。 word的想法很好,因为它避免使用全局变量。如果您提到使用全局变量(并非真正鼓励),则建议删除word,因为它会让人感到困惑)。

所以,你的说法应该认真阅读

br.form['q'] = word[1]

+0

捷尔感谢您耐心等待,并回答我的问题。我应该强调一点,我没有使用sys.argv。我以为kwargs使用的列表和元组不是argv。 – tijko 2012-08-12 21:51:48

+1

@tijko没问题。 *没有人*出生在这里知道Python(或其他任何东西:)从你以前的问题和错误消息,我怀疑这条线是问题。我希望这能解决你的问题。 – Levon 2012-08-12 21:53:02

+0

对,并非常感谢。它解决了这个问题,我明白为什么! :D – tijko 2012-08-12 21:54:00

相关问题