我有以下代码:
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的限制?这似乎有点奇怪,因为退出和标准输出在C中是如此容易获得。然而,错误消息看起来可能是关于不同的事情,所以我可能只是在错误的树上咆哮。
目前我正在使用this指南大致了解RPython中允许和不允许的内容。是否有其他可以访问的参考资料我可以用来获取更多信息?
答案 0 :(得分:9)
sys模块不是RPython,你不能在RPython程序中使用它。要返回状态代码,必须直接从entry_point函数返回。
您也不能使用sys.stdout / sys.stdin / sys.stderr,您需要使用结合文件描述符的os.read/os.write函数进行读/写。