【问题标题】:Using Python's sys.argv to return function results to command line?使用 Python 的 sys.argv 将函数结果返回到命令行?
【发布时间】:2012-08-09 04:20:54
【问题描述】:

我有一个可执行文件。它有一个函数,我想将其结果返回到命令行,但是,我不断收到 NameError 消息。为了分解,我使用的是 LinuxMint Lisa,到目前为止我有:

#! /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'] = word
    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)

然后我从我的终端 chmod:

sudo chmod +x this_file.py

当我从命令行调用这个文件时,我会输入:

./this_file.py 'pass'(or any other string argument)

哪个会返回:

TypeError: Must assign a string

所以我知道我显然没有正确使用 sys.argv,但是,当我尝试将此函数结果返回到命令行时,我感觉好像在搞砸别的东西。

【问题讨论】:

  • in print dictionary(agrv) argv 拼写错误。另外,使用sys.argv
  • 最好提供完整的回溯,以便为错误消息提供一些上下文 - 尤其是有关发生错误的行号的信息。
  • 另外,您可能会考虑发布一个不同的问题,而不是“发展”这个问题。只是一个想法。

标签: python linux arguments command-line-arguments


【解决方案1】:

好的,我不妨将其发布为我的答案,而不仅仅是评论:

print dictionary(agrv)

argv 拼写错误。

应该是

print dictionary(sys.argv)

另外,单独使用sys.argvargv 是不够的

【讨论】:

  • 当我使用sys.arvg 时出现语法错误。所以def dictionary(sys.argv):不正确?
  • @tijko sys.arv 不正确,它是 sys.argv(注意“g”)。你调用你的参数你的函数头(带有def的行)完全取决于你,但在调用中你确实需要正确的名称。
  • 是的,我需要更加小心这里的拼写。我在文件中的内容是sys.argv
  • @tijko 我通常会将代码从其他地方复制粘贴到这里,否则会出现拼写错误的风险:) 这解决了您的问题吗?
  • 我现在返回一个 TypeError。
【解决方案2】:

argv 是sys 模块的一个属性

使用任一

sys.argv

或者做

from sys import argv

【讨论】:

  • 我想到了,但由于某种原因,我记得看到 argv 是单独使用的?
  • 如果你写import sys你必须使用sys.argv,否则如果你写from sys import argv你必须使用argv。两者都是正确的。
【解决方案3】:

不应该是print dictionary(sys.argv[1])。我猜你想在 dictionary.com 中搜索命令行参数

【讨论】:

    【解决方案4】:

    当前发布的问题的问题是 sys.argv 是一个列表,而不是字符串,因此当您设置表单条目“q”时,您将其设置为程序的参数列表。您可以更改程序以传入第一个参数:

    print dictionary(sys.argv[1])
    

    或者多次调用字典函数:

    for i in sys.argv[1:]:
        print dictionary(i)
    

    请注意,我们不想包含程序名称本身,因此请省略 sys.argv[0]。

    【讨论】:

    • 啊,有道理。我没有太多使用 sys.argv 并且它显示了。我认为 **kwargs 使用了列表、元组等。
    【解决方案5】:

    您没有明确将结果“返回”到命令行是什么意思。如果你只想打印结果,可以print

    但是您收到的错误消息与此无关。这是由两件事引起的:一,你放了agrv 而不是argv。其次,您已经导入了sys,因此您需要引用sys.argv 而不仅仅是argv

    【讨论】:

    • 你的字典函数可以随意调用它的参数。但是您必须使用dictionary(sys.argv) 调用它(代码中的最后一行)。这与 argv 具体无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2014-12-08
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    相关资源
    最近更新 更多