Как разрешить привязки во время исполнения со встроенным Python? - PullRequest
0 голосов
/ 04 июня 2010

Я встраиваю Python в приложение C ++. Я планирую использовать PyEval_EvalCode для выполнения кода Python, но вместо предоставления locals и globals в качестве словарей, я ищу способ, чтобы моя программа разрешала ссылки на символы динамически ,

Например, допустим, мой код на Python состоит из следующего выражения:

bear + lion * bunny

Вместо размещения bear, lion и bunny и связанных с ними объектов в словарях, которые я передаю PyEval_EvalCode, я бы хотел, чтобы интерпретатор Python перезвонил моей программе и запросил их объекты.

Есть ли способ сделать это?

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Предоставляя локальные и глобальные словари, вы предоставляете среду, в которой выполняется проверенный код. Это эффективно предоставляет вам интерфейс для сопоставления имен с объектами, определенными в приложении C ++.

Можете ли вы уточнить, почему вы не хотите использовать словари?

Еще одна вещь, которую вы можете сделать, это обработать строку в C ++ и выполнить подстановку строки перед тем, как выполнить код ....

1 голос
/ 04 июня 2010

Возможно. Я никогда не пробовал этого, но теоретически вы могли бы реализовать небольшой класс расширения в C ++, который переопределяет метод __getattr__ (возможно, с помощью указателей на функции tp_as_mapping или tp_getattro, равные PyTypeObject). Передайте экземпляр этого в качестве локальных и / или глобальных имен в PyEval_EvalCode, и ваш метод C ++ должен попросить разрешить для вас ваших львов, тигров и медведей.

...