【问题标题】:Python sys.argv TypeErrors with printing function results?Python sys.argv TypeErrors 打印函数结果?
【发布时间】:2012-08-12 21:44:54
【问题描述】:

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

【问题讨论】:

    标签: python command-line arguments


    【解决方案1】:

    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]

    【讨论】:

    • Levon 感谢您耐心地回答我的问题。我应该强调我没有太多使用 sys.argv 的事实。我在想 kwargs 使用列表和元组而不是 argv。
    • @tijko 没问题。 没有人 出生就知道 Python(或其他任何东西 :) 从您之前的问题和错误消息中,我怀疑这行是问题所在。我希望这能解决您的问题。
    • 正确,非常感谢。它解决了问题,我明白为什么! :D
    • @tijko 另请注意,您将参数word 传递给dictionary 函数,但随后您直接使用sys.argv。您可能想在函数中使用word 并像dictionary(sys.argv[1]) 一样调用它。
    • @tijko 直接使用它是可以的,但是你应该将未使用的word 参数取出到你的函数中,这会令人困惑。使用word 的优势在于,您可以从其他代码中调用dictionary 函数,可能是在命令行中的多个单词的循环中,或者作为其他任务的一部分,或者您可能想要使用它的任何其他地方.
    猜你喜欢
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 2019-03-11
    相关资源
    最近更新 更多