我一直在尝试学习如何正确使用 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
最佳答案
与
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]
关于带有打印函数结果的 Python sys.argv TypeErrors?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11926120/