8

我有以下代码:

import sys

def entry_point(argv):
    sys.exit(1)
    return 0

def target(*args):
    return entry_point, None

但是,当我运行时,出现python ./pypy/pypy/translator/goal/translate.py t.py以下错误:

...
[translation:ERROR]  Exception: unexpected prebuilt constant: <built-in function exit>
[translation:ERROR] Processing block:
[translation:ERROR]  block@9 is a <class 'pypy.objspace.flow.flowcontext.SpamBlock'>
[translation:ERROR]  in (t:3)entry_point
[translation:ERROR]  containing the following operations:
[translation:ERROR]        v0 = simple_call((builtin_function_or_method exit), (1))
[translation:ERROR]  --end--

实际上还有更多错误,但我认为只有最后一部分是相关的。如果您认为更多内容可能会有所帮助,请发表评论,我将进行编辑。

事实上,当我用更简单的东西(如 sys.stdout.write)替换 sys.exit 时,我得到了另一个错误。

import sys

def entry_point(argv):
    sys.stdout.write('some mesg\n')
    return 0

def target(*args):
    return entry_point, None

给我:

...
[translation:ERROR]  AnnotatorError: annotation of v0 degenerated to SomeObject()
[translation:ERROR] v0 = getattr((module sys), ('stdout'))
[translation:ERROR]
[translation:ERROR] In <FunctionGraph of (t:3)entry_point at 0x10d03de10>:
[translation:ERROR] Happened at file t.py line 4
[translation:ERROR]
[translation:ERROR] ==>     sys.stdout.write('some mesg\n')
[translation:ERROR]
[translation:ERROR] Previous annotation:
[translation:ERROR]   (none)
[translation:ERROR] Processing block:
[translation:ERROR]  block@3 is a <class 'pypy.objspace.flow.flowcontext.SpamBlock'>
[translation:ERROR]  in (t:3)entry_point
[translation:ERROR]  containing the following operations:
[translation:ERROR]        v0 = getattr((module sys), ('stdout'))
[translation:ERROR]        v1 = getattr(v0, ('write'))
[translation:ERROR]        v2 = simple_call(v1, ('some mesg\n'))
[translation:ERROR]  --end--

sys 方法是否只是 RPython 的禁区?对我来说这似乎有点奇怪,因为 exit 和 stdout 在 C 中很容易使用。但是,错误消息看起来可能是关于不同的事情,所以我可能只是在错误的树下吠叫。

目前,我正在使用指南大致了解 RPython 中允许和不允许的内容。是否有其他可访问的参考资料可供我使用以获取更多信息?

4

1 回答 1

8

sys 模块不是 RPython,你不能在 RPython 程序中使用它。要返回状态代码,您必须直接从 entry_point 函数返回它。

您也不能使用 sys.stdout/sys.stdin/sys.stderr,您需要使用 os.read/os.write 函数结合文件描述符进行读/写。

于 2012-02-11T22:37:14.627 回答