Как создать и назначить переменную Python в C? - PullRequest
2 голосов
/ 08 июня 2011

Я инициализировал среду Python

Py_Initialize();

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

Я думал добавить в среду функцию для присвоения переменной, как в следующем коде.

char *str;
str="\
def assign_var(str):\
    global string\
    string = str";
PyRun_SimpleString(str);

А затем вызовите эту функцию в C и передайте преобразованную строку C в качестве аргументов.

Не думаю, что все, что я упомянул выше, является хорошим способом решения проблемы ...

Как я могу сделать эту работу?

Решение:

Наконец, вот решение с помощью Peter Mortensen . (Спасибо, Питер Мортенсен!)

Поскольку среда Python, которую я инициализировал, является чистой пустой средой (без каких-либо импортированных модулей). я использую

py_main = PyImport_AddModule("__main__");

чтобы получить доступ к основному окружению. а затем позвоните

PyModule_AddStringConstant(py_main, "string_name", str);

для переноса строки C в среду Python.

Чтобы убедиться, что все сделано, просто попробуйте:

PyRun_SimpleString("print dir()");
PyRun_SimpleString("print string_name");

и вы увидите, что строка "string_name" появляется в списке dir () и выводит ее на печать с помощью python!

1 Ответ

2 голосов
/ 08 июня 2011

Это должно делать то, что вы хотите:

char *cStr = "Some text here.";

PyObject *pyStr = Py_BuildValue("s", cStr);

http://docs.python.org/c-api/arg.html#Py_BuildValue

Конечно, если вы используете Python 3 (или будете использовать его в будущем), могут быть ситуации, когда вы захотите использовать «y» вместо «s» и получить объект bytes вместо str.

ОБНОВЛЕНИЕ: Woops, я забыл еще более простой способ сделать это.

PyObject *pyStr = PyString_FromString(cStr);

http://docs.python.org/c-api/string.html#PyString_FromString

(Это будет PyBytes_FromString() в Python 3.)

Возможно, вы захотите взглянуть на http://docs.python.org/extending/embedding.html для получения дополнительной информации.

<Ч />

Вот еще кое-что, что вы можете попробовать. Смотри

http://docs.python.org/c-api/module.html#PyModule_AddObject
Или возможно
http://docs.python.org/c-api/module.html#PyModule_AddStringConstant

С первым было бы что-то вроде

errorcheck = PyModule_AddObject(embmodule, "str", pyStr);

А с последним что-то типа

errorcheck = PyModule_AddStringConstant(embmodule, "str", cStr);
...