【问题标题】:How to create and assign a Python variable in C?如何在 C 中创建和分配 Python 变量?
【发布时间】:2011-09-11 00:38:11
【问题描述】:

我已经通过

初始化了 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 打印出来!

【问题讨论】:

  • 也许this 的变体会起作用?
  • @senderle 抱歉,that case,他已经在模块中有一个变量 g,但在我的情况下,我没有...感谢您的评论,我已经重新定义了我的标题问题(添加“创建”)
  • 我的想法是,您可以使用PySys_GetObject 获得对__main__ 的引用。但是,如果不确切知道自己在做什么,就很难说出自己想要发生的事情。

标签: python c embed


【解决方案1】:

这应该做你想做的:

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.

更新:糟糕,我忘记了更简单的方法。

PyObject *pyStr = PyString_FromString(cStr);

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

(在 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);

【讨论】:

  • 对不起,这不是我要找的......你在这里提到的所有函数总是返回 PyObject* 并且在 python 环境中没有任何反应。 python 字符串仍然在 C 环境中,而不是在 python 环境中。你对将python字符串从C语言环境转移到python环境有什么想法吗?
  • 看看docs.python.org/extending/…。您需要编写一个函数,使用我展示的相同PyString_FromString() 函数将字符串作为 PyObject 返回,创建一个 PyMethodDef 对象数组,然后使用该方法数组初始化一个模块。然后从 Python 端导入模块并调用模块的方法来访问数据。
  • PyMethodDef 结构体,而不是。
  • 嗨,很抱歉我的回复晚了。我终于找到了一种创建和分配字符串的方法。正如你提到的,我正在使用 Module_AddStringConstant(mod, "name", cStr);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2016-11-19
  • 1970-01-01
  • 2017-05-29
相关资源
最近更新 更多