【问题标题】:How to trace which file causes a syntax error?如何跟踪哪个文件导致语法错误?
【发布时间】:2012-05-21 14:59:00
【问题描述】:

我不完全知道我做了什么,但似乎我破坏了我的构建系统。

$ scons install
scons: Reading SConscript files ...
File "<string>", line 1

I_���.�K
        H�4����Ǐ��U)�f���R�f���ў�U)�f���R�f���ў�

   ^

SyntaxError: invalid syntax

不可打印的字符是有意的。

坏事是:即使在“已知的工作”版本上重置也无济于事,以及使用像 --debug=stacktrace 这样的选项。我的版本控制系统(mercurial)没有显示SCons 文件中的更改,我不知道如何继续。任何提示如何让 mercurial 打印它正在处理的文件的名称以找出正在发生的事情?

我的下一步是对该项目进行新的克隆(希望能够构建),但我很好奇这里出了什么问题。

更新

当我更新到 Ubuntu 12.04 后问题消失了。 “消失”意味着在这种情况下,我突然能够执行scons --clean 命令,之后我能够再次重建我的项目。遗憾的是我无法重现该错误,所以最后我不知道是什么原因造成的,因为它工作了几个月,而且我的同事之前没有一个出现过这样奇怪的错误。

这是我的脚本的摘录:

vars = Variables( "variables.cache" )
vars.Add( "CXX", "use this c++ compiler", "/usr/bin/g++" )
# (other stuff added to vars)

env = Environment( variables = vars )  # <-- this line caused the error

在解决这个问题的过程中,我的印象是,在更新之后,Python 能够给我一个更好的错误消息,并且该消息(试图记住它)vars 在某种程度上是无效的。所以也许问题出在variables.cache,我不知道。也许我应该删除这个文件(我没有删除)以消除错误。

【问题讨论】:

  • 为什么要使用不可打印的字符?
  • 抱歉没有找到更好的词。我的意思是:他们在终端中以这种方式出现,我在这里没有输入错误,隐藏了有用的代码行。看起来 scons 试图解析二进制文件之类的?

标签: scons


【解决方案1】:

尝试执行带有警告的 scons,如下所示:

# scons --warn=all

如果这没有帮助,您可以尝试更老式的方法,并在 SConstruct 中放置一些打印语句,以查看发生了什么以及问题发生的时间/地点。

您也可以尝试清理整个项目并删除/重命名根项目中的 .sconsdb.lite。

更新:

我最近遇到了一个问题,因为 Python 的版本从 2.6 更改为 2.7,并且错误处理完全改变了。因此,请尝试在 SConstruct 中的所有内容(或至少是战略部分)周围放置一个 python try/except 块,并打印抛出的异常(如果有)。

如果这些都不起作用,请尝试在此处发布 SConstruct。

来自我的SConstruct 的代码示例演示了我如何使用 Python 的 try/except 块发现我的错误。 BuildError 异常给了我一个堆栈跟踪。还有更多可以“捕捉”的异常。

...
try:
    SConscript(
        os.path.join(moduleDir, 'SConscript'),                        # sub-directory SConscript to load
        variant_dir = '#%s' % os.path.join(env['variantDir'], dir),   # path relative to this script where to put built files
        exports = ['env'],                                         # which variables to export to sub-directory build
        duplicate = 0)                                             # dont duplicate source files in variant_dir
except SCons.Errors.BuildError as be:
    print "*** BuildError exception processing module: %s, %s" % (moduleDir, be.__str__())
    raise
except:
    print "*** Unhandled exception processing module: %s" % moduleDir
    raise

【讨论】:

  • 感谢您的支持!该项目非常庞大(有几个子目录,因此是 SConcripts),“导致”错误的行就像 env = Environment(var=vars) 或类似的,我现在没有它(由 print "foo" 调试发现)。我肯定会在周三或明天尝试!
  • 好吧,没有什么能真正起作用......我知道这条线,但由于我没有手动更改任何内容,它一定是与生成的文件或类似文件不一致。我不能清理,我不能做任何涉及scons 命令的事情,因为它会因SyntaxError 而失败。
  • @wal-o-mat,我知道你说这个项目很大,但你至少可以发布 SConstruct/SConscript 的相关部分吗?如果它很大,您可以考虑将其发布到 ideone.com。
  • @wal-o-mat,很高兴听到它再次工作。听起来 variables.cache 文件确实是问题所在。您是否每次都尝试放入 try/except 块?那应该提供更多信息。
  • 我在可疑块/行之前和之后厌倦了print 'foo',没有try/catch。但正如你所看到的:被抛出和未被捕获的SyntaxError 没有给我任何可读的线索,通常它会打印错误的代码行或类似的东西。
猜你喜欢
  • 2022-08-10
  • 1970-01-01
  • 2021-08-28
  • 2018-03-11
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多