Python学习笔记(二)
int Py_Main(int argc, char** argv)
类似于C中的main,不多说了
然后在C中执行python程序,分成以下几类函数
(1)int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)执行python代码片断,代码为输入的字符串,成功返回0,失败-1
int PyRun_SimpleString(const char *command)为简化版
(2)int PyRun_SimpleFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)执行python文件,如果参数closeit为true,在返回前关闭文件
int PyRun_SimpleFileEx(FILE *fp, const char *filename, int closeit)
int PyRun_SimpleFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
int PyRun_SimpleFile(FILE *fp, const char *filename)
为简化版本
(3)int PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)读取并执行一句代码,文件关联到交互设备,如果输入代码执行成功返回0,失败返回-1
int PyRun_InteractiveOne(FILE *fp, const char *filename)简版
(4)int PyRun_InteractiveLoopFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)循环直到EOF
int PyRun_InteractiveLoop(FILE *fp, const char *filename)简版
(5)int PyRun_AnyFileExFlags(FILE *fp, const char *filename, int closeit, PyCompilerFlags *flags)如果fp是引用一个和交互设备相关的文件,则返回PyRun_InteractiveLoop()的值,否则返回 PyRun_SimpleFile()的值
int PyRun_AnyFileEx(FILE *fp, const char *filename, int closeit)
int PyRun_AnyFileFlags(FILE *fp, const char *filename, PyCompilerFlags *flags)
int PyRun_AnyFile(FILE *fp, const char *filename)为简版
(6)struct _node* PyParser_SimpleParseStringFlags(const char *str, int start, int flags)使用开始符来解析python代码,结果能更有效的创建一个代码对象
struct _node* PyParser_SimpleParseStringFlag(const char *str, int start, int flags)简版
(7)struct _node* PyParser_SimpleParseFileFlags(
FILE *fp, const char *filename, int start, int flags)用开始符解析文件,代替上面的从内存传递的字符串
struct _node* PyParser_SimpleParseFile(FILE *fp, const char *filename, int start)简版
(8)PyObject* PyRun_StringFlags(const char *str, int start, PyObject *globals,PyObject*locals,PyCompilerFlags *flags)执行字符串中的python代码,返回python代码的python object对象,异常时NULL
PyObject* PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)简版
(9)PyObject* PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject*locals, PyCompilerFlags *flags)执行文件代码
PyObject* PyRun_FileFlags(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, PyCompilerFlags *flags)
PyObject* PyRun_FileEx(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals, int closeit)
PyObject* PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)简版
(10)PyObject* Py_CompileStringFlags(
const char *str, const char *filename, int start, PyCompilerFlags *flags)编译python代码,返回代码对象
PyObject* Py_CompileString(const char *str, const char *filename, int start)简版
(11)开始符种类
int Py_eval_input 适用于单独表达式int Py_file_input 使用于连续语句,编译任意长python代码时使用
int Py_single_input 单一语句,交互式输入
引用计数相关函数
(1)void Py_INCREF(PyObject *o)
void Py_XINCREF(PyObject *o)
增加引用计数,如果不确定对象o是否为空,使用后者
(2)void Py_DECREF(PyObject *o)
void Py_XDECREF(PyObject *o)
减少引用计数,如果不确定对象o是否为空,使用后者
如 果计数为0,则会调用代码释放对象,而释放代码,可能会执行任意想不到的代码,所以对于类似将一个对象从list中移走时,不能直接调用释放代码,应将起 保存在临时变量(增加引用计数不为0,而不调用deallocation)等移出list后,减少引用计数到0,再调用deallocation
(3)void Py_CLEAR(PyObject *o)同上,但我觉得会清空引用计数
2.4以后版本使用Py_IncRef(PyObject *o), Py_DecRef(PyObject *o)