Методы RPython sys не работают - PullRequest
8 голосов
/ 11 февраля 2012

У меня есть следующий код:

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.exit чем-то еще более простым, например sys.stdout.write.

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. Есть ли другие достаточно доступные ссылки, которые я мог бы использовать для получения дополнительной информации?

1 Ответ

9 голосов
/ 12 февраля 2012

Модуль sys не является RPython, его нельзя использовать в программе RPython. Чтобы вернуть код состояния, вы должны вернуть его непосредственно из функции entry_point.

Вы также не можете использовать sys.stdout / sys.stdin / sys.stderr, вам нужно читать / писать, используя функции os.read/os.write в сочетании с файловым дескриптором.

...