【问题标题】:TypeError: abspath() takes exactly 1 argument (2 given)类型错误:abspath() 只需要 1 个参数(给定 2 个)
【发布时间】:2012-07-06 10:08:27
【问题描述】:

运行 python 脚本(由 ./waf --run 调用)时出现此错误: TypeError: abspath() 只接受 1 个参数(给定 2 个)

问题是它确实被调用了:obj.path.abspath(env)。

这不是 python 问题,因为该代码以前可以完美运行,并且它是一个巨大项目 (ns3) 的一部分,所以我怀疑它被破坏了。

但是,我的设置肯定发生了一些变化,因为这段代码以前有效,现在无效。

你能帮我弄清楚为什么会出现这个错误吗?

这里是 python 代码:http://pastebin.com/EbJ50BBt。错误发生在第 61 行。

【问题讨论】:

  • 欢迎提供一些出现错误的代码...
  • @emmanuel:是的,这越来越烦人了。人们在寻求帮助/评论,但从不向我们展示他们的问题所在!就像我们是先知一样! ;-)
  • obj.path.abspath() 是对象obj.path 的一个方法——该对象可能具有的任何类型。由于实例作为第一个参数隐式传递给方法,因此该方法确实是用两个参数调用的。检查这个方法所属的库的文档,或者至少告诉我们这个库可能是什么。
  • emmanuel,请不要提问:请参阅 python 代码的编辑。 sven marnach:不,我只是在使用 c++ 代码,但我正在使用 waf 运行我的程序(构建成功),并且 waf 在发生此错误的地方调用这个 wscript.py 文件。
  • 为什么觉得C++这个标签合适呢?删除它。

标签: c++ python networking


【解决方案1】:

Node.abspath() 方法的文档声明它不需要额外的 env 参数,我通过检查 git 历史确认它从未这样做过。我建议更换

if not (obj.path.abspath().startswith(launch_dir)
        or obj.path.abspath(env).startswith(launch_dir)):
    continue

if not obj.path.abspath().startswith(launch_dir):
    continue

如果这段代码以前有效,这可能是因为or 表达式的第一个运算符恰好总是True,所以第二个运算符从未执行过。无论如何,这似乎是您的代码中的一个错误。

【讨论】:

  • 感谢您的努力。我尝试了您的建议,但不幸的是,它也不起作用,尽管错误不同。它现在显示“未找到程序 'test';可用程序是:[]”,尽管 test.cc 位于临时文件夹中,所以它应该可以工作。
【解决方案2】:

你应该在回溯中有一个文件名和行号。转到该文件和行并找出“obj”和“obj.path.abspath”是。一个简单的解决方案是将违规行放在 try/except 块中以打印(或记录)更多信息,即:

# your code here
try:
    whatever = obj.path.abspath(env)
except Exception, e:
    # if you have a logger
    logger.exception("oops : obj is '%s' (%s)" % (obj, type(obj)))
    # else 
    import sys
    print >> sys.stderr, "oops, got %s on '%s' (%s)" % (e, obj, type(obj))
    # if you can run this code directly from a shell,
    # this will send you in the interactive debugger so you can
    # inspect the offending objet and the whole call stack.
    # else comment out this line
    import pdb; pdb.set_trace()

    # and re-raise the exception
    raise

我敢打赌,“obj.path”不是 python 'os.path' 模块,而“obj.path.abspath”是一个实例方法,只接受“self”作为参数。

【讨论】:

  • 我已经在我的编辑中添加了整个代码,这样你就可以看到 obj.path 是什么。但正如我所说,我不认为这个错误来自脚本中的错误,而是来自我的设置方式。我之前已经能够成功运行这个脚本(这个python脚本是由./waf --run调用的),我不知道之后发生了什么变化
  • objbld.all_task_gen 返回,并且在您的代码 sn-p 中没有定义 obj 的类,所以不,我们看不到obj.path 是什么。我们唯一知道的是它应该有一个具有真值的“is_ns3_program”属性。此外,bld 在您的脚本中仅绑定一次,并且绑定到 None(如果没有其他代码导入它并将 bld 重新绑定到所谓“可用”的东西,恕我直言,它无法运行 非常 糟糕的设计)所以我们甚至不知道bld 应该是什么。
【解决方案3】:

问题在于显然 waf 不喜欢符号链接,python 代码不能为这种情况准备。

问题已解决,谢谢大家的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多