- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经通过以下方式初始化了 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__");
获取主环境的 Hook 。然后调用
PyModule_AddStringConstant(py_main, "string_name", str);
将C字符串带入python环境。
要验证一切都已完成,只需尝试:
PyRun_SimpleString("print dir()");
PyRun_SimpleString("print string_name");
你会看到“string_name”字符串出现在 dir() 列表中,并通过 python 打印它!
最佳答案
这应该做你想做的:
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);
关于python - 如何在 C 中创建和分配 Python 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6281781/
我是一名优秀的程序员,十分优秀!