如何在C中创建并赋值Python变量?
我已经通过以下代码初始化了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 个回答
这段代码应该能满足你的需求:
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);