Как получить доступ к глобальной переменной Python из C? - PullRequest
9 голосов
/ 13 ноября 2008

У меня есть несколько глобальных переменных в скрипте Python. Некоторые функции в этом скрипте вызывают в C - возможно ли установить одну из этих переменных в C, и если да, то как?

Я ценю, что это не очень хороший дизайн, во-первых, но мне нужно внести небольшие изменения в существующий код, я не хочу заниматься рефакторингом существующих скриптов.

Ответы [ 4 ]

14 голосов
/ 13 ноября 2008

Я не гуру питона, но мне этот вопрос показался интересным, поэтому я начал гуглить. Этот был первым хитом "API встраивания Python" - это помогает?

Если атрибуты принадлежат глобальному объем модуля, то вы можете использовать "PyImport_AddModule", чтобы получить дескриптор к объекту модуля. Например, если Вы хотели получить значение целое число в основном модуле с именем "foobar", вы бы сделали следующее:

PyObject *m = PyImport_AddModule("__main__");
PyObject *v = PyObject_GetAttrString(m,"foobar");

int foobar = PyInt_AsLong(v);

Py_DECREF(v);
6 голосов
/ 18 сентября 2014

Для тех, кто приходит сюда из Google, вот прямой метод:

PyObject* PyEval_GetGlobals()

https://docs.python.org/2/c-api/reflection.html

https://docs.python.org/3/c-api/reflection.html

Возвращаемое значение доступно как словарь.

0 голосов
/ 13 ноября 2008

Готовы ли вы изменить API немного ?

  • Вы можете заставить функцию C возвращать новое значение для глобальной переменной, а затем вызывать ее следующим образом:

    my_global = my_c_func(...)

  • Если вы используете Robin или Python C API напрямую, вы можете передать словарь глобалов в качестве дополнительного параметра и изменить его

  • Если ваш глобал всегда находится в одном и том же модуле, решение Sherm выглядит великолепно
0 голосов
/ 13 ноября 2008

Я рекомендую использовать pyrex, чтобы создать модуль расширения, в котором вы можете хранить значения в python, и cdef набор функций, которые можно вызывать из C, чтобы вернуть значения там.

В противном случае многое зависит от типа значений, которые вы пытаетесь передать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...