如何在C中创建并赋值Python变量?

3 投票
1 回答
1868 浏览
提问于 2025-04-16 19:11

我已经通过以下代码初始化了Python环境:

Py_Initialize();

我没有在这个环境中导入任何外部的Python模块,一切运行得很好。但是当我需要把一个C语言的字符串传入这个环境时,我就不知道该怎么做了...

我在想要在环境中添加一个函数,像下面的代码那样来给变量赋值。

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

然后在C语言中调用这个函数,把转换后的C字符串作为参数传进去。

不过我觉得我上面提到的这些方法并不是解决问题的好办法...

我该怎么才能让这个工作呢?

解决方案:

最后,在Peter Mortensen的帮助下,我找到了解决方案。(谢谢你,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

这段代码应该能满足你的需求:

char *cStr = "Some text here.";

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

当然,如果你在用Python 3(或者将来会用),可能会遇到需要用“y”而不是“s”的情况,这样你就能得到一个bytes对象,而不是str对象。

更新:哎呀,我忘了还有一种更简单的方法。

PyObject *pyStr = PyString_FromString(cStr);

在Python 3中,这个方法应该是PyBytes_FromString()

你可能还想看看这个链接,里面有更多信息: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);

撰写回答