1

我一直在尝试学习如何正确使用 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

1 回答 1

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]

于 2012-08-12T21:46:28.067 回答