贡献者: addis
PYTHONHOME 环境变量是 python 解释器和标准库等的路径(子文件夹有 include, libs, Scripts)
PYTHONPATH 环境变量用于指定额外的模块搜索路径(当前路径和 python 安装路径之外的)(Linux 多个路径用 : 隔开,Windows cmd 用 ; 隔开)
PYTHONSTARTUP 指定启动脚本、PYTHONDEBUG 使用 debug 模式,相当于 -d 选项、PYTHONUNBUFFERED 强制标准输出和标准错误不被 buffer、PYTHONHASHSEED 指定随机数种子、PYTHONTRACEMALLOC 用 tracemalloc 模块跟踪内存占用、PYTHONPYCACHEPREFIX 可以指定一个专门用于存放 pyc 文件的目录,而不是直接在源码目录中用 __pycache__。
Py_Initialize() 之前即可,而无需在运行前。
PyObject * 可以容纳任何 python 对象
Py_Initialize() 和 Py_Finalize() 开始和结束 python 解释器。
PyObject *pModule = PyImport_Import(pName); 可以加载 python 模块。
Py_DECREF(PyObject *obj); 是一个宏,可以把 obj 对象的引用计数减一,当减少到零该对象就会自动销毁。Py_INCREF(PyObject *obj); 把引用加一。
Py_XDECREF() 更安全,因为它会先检查 obj 是否为 NULL。
Py_REFCNT() 可以查看引用计数。
PyObject * PyObject_Str(PyObject *) 或 PyObject_Repr 可以返回字符串对象显示对象信息
创建变量
PyObject *pName = PyUnicode_FromString("my_python_module"); 可以从 utf-8 编码的 C 字符串创建一个 python 字符串变量。
PyUnicode_AsUTF8AndSize
PyObject *obj = PyLong_FromLong(42); 创建 python 整数。
PyFloat_FromDouble() 从 double 创建浮点数,PyFloat_AsDouble 提取 double。
PyObject *int_obj = Py_BuildValue("i", 42); 也可以创建 python 整数,该函数更动态更灵活,例如 PyObject *tuple_obj = Py_BuildValue("(is)", 42, "Hello"); 创建一个整数和字符串的 touple。
PyObject *arg = PyList_New(2);,PyList_SetItem(arg, 0, PyLong_FromLong(1));,PyList_SetItem(arg, 1, PyLong_FromLong(2));
获取变量
PyArg_Parse(obj, "i", &result_c); 从 PyObject *obj 获取整数存到 int result_c 中。
PyObject* PyObject_GetAttrString(PyObject *obj, const char *attr_name); 获取对象的属性(attribute)。模块也是对象,如 math.pi 就是模块 math 对象的 pi 属性。它也可以用于获取函数如 math.sin。如果失败,返回 NULL,可以用 PyErr_Print() 打印错误信息。也可以用于获取对象的成员函数对象(绑定该对象)
检查变量
PyLong_Check(obj) 检查一个对象是否为 Long,PyFloat_Check(obj) 检查是否为浮点数,PyUnicode_Check(obj) 检查是否为字符串,另外有 PyList_Check(obj),PyDict_Check(obj)
PyObject* get_dict_item(PyObject* namespace, const char* name) {
if (!PyDict_Check(namespace)) {
PyErr_SetString(PyExc_TypeError, "namespace must be a dictionary");
return NULL;
}
// Retrieve the variable by name
PyObject* variable = PyDict_GetItemString(namespace, name);
if (variable == NULL)
PyErr_Format(PyExc_NameError, "name '%s' is not defined", name);
// Increase reference count to return a new reference
Py_XINCREF(variable);
return variable;
}
PyObject* globals = PyEval_GetGlobals(); // 全局变量的字典(工作区)
PyObject* locals = PyEval_GetLocals(); // 本地变量的字典(工作区)
PyObject* g_variable = get_variable_by_name(globals, "my_variable");
PyObject* g_variable = get_variable_by_name(locals, "my_variable");
PyObject* PyObject_CallFunctionObjArgs(PyObject *callable, ...); 可以调用函数,后面是函数的参数,以 NULL 结尾。
PyObject_CallMethod()
PyObject *result = PyNumber_Add(obj1, obj2); 可以对两个对象使用算符 +,如果是用户定义的对象则会调用 __add__() 方法。
 
 
 
 
 
 
 
 
 
 
 
友情链接: 超理论坛 | ©小时科技 保留一切权利