>php教程 >PHP开发 >C/C++에 Python 포함

C/C++에 Python 포함

高洛峰
高洛峰원래의
2016-11-23 13:47:471591검색

C/C++에 Python을 포함시키는 것도 비교적 간단합니다. 먼저 VC에 Python의 포함 파일 디렉터리와 lib 파일 디렉터리를 추가해야 합니다.
VC6.0에서 tools->options->directories-를 엽니다. > ;디렉터리 표시, Python 설치 디렉터리의 inlude 디렉터리를 포함 파일 항목에 추가하고 libs 디렉터리를 라이브러리 파일 항목에 추가합니다.
VC2005에서 도구->옵션->프로젝트 및 솔루션->VC++ 디렉토리를 열고 동일한 작업을 수행합니다.

코드는 다음과 같습니다.

//在debug下执行出错,“无法找到python31_d.lib文件”,后查到原因是:在debug下生成必须要有python31_d.lib文件,否则只能在release下生成
#include <python.h>
int main()
{
    Py_Initialize();
    PyRun_SimpleString("Print &#39;hi, python!&#39;");
    Py_Finalize();
    return 0;
}

Py_Initialize 함수 프로토타입은 void Py_Initialize()입니다. 이 함수는 Python 스크립트를 삽입할 때 사용해야 합니다. 다른 스크립트를 사용할 때 Python 인터프리터를 초기화합니다. Python/ 이 함수는 C API보다 먼저 호출되어야 합니다. Py_IsInitialized 함수를 사용하여 초기화가 성공했는지 확인하고 성공하면 True를 반환할 수 있습니다.
PyRun_SimpleString 함수의 프로토타입은 Python 코드 조각을 실행하는 데 사용되는 int PyRun_SimpleString(const char *command)입니다. 참고: 명령문 사이에 들여쓰기를 유지해야 합니까?
Py_Finalize 함수의 프로토타입은 Python 인터프리터를 닫고 인터프리터가 차지한 리소스를 해제하는 데 사용되는 void Py_Finalize()입니다.

PyRun_SimpleFile 함수는 ".py" 스크립트 파일을 실행하는 데 사용할 수 있습니다. 함수 프로토타입은 다음과 같습니다:
int PyRun_SimpleFile(FILE *fp, const char *filename);
여기서 fp는 열린 파일 포인터, filename은 실행할 Python 스크립트 파일의 이름입니다. 그러나 이 함수의 공식 릴리스는 Visual Studio 2003.NET에서 컴파일되므로 다른 버전의 컴파일러를 사용하는 경우 버전 문제로 인해 FILE 정의에서 충돌이 발생할 수 있습니다. 동시에 단순화를 위해 다음 방법을 사용하여 이 함수를 대체할 수 있습니다:
PyRun_SimpleString("execfile('file.py')") //execfile을 사용하여 Python 파일 실행

Py_BuildValue()가 사용됩니다. Python에서 숫자와 문자열을 해당 데이터 유형으로 변환합니다(C 언어에서는 모든 Python 유형이 PyObject 유형으로 선언됩니다). 함수 프로토타입은 다음과 같습니다:
PyObject *Py_BuildValue(const char *format, … ..);
PyString_String()은 PyObject* 유형의 변수를 C 언어에서 처리할 수 있는 char* 유형으로 변환하는 데 사용됩니다. 구체적인 프로토타입은 다음과 같습니다.
char* PyString_String(PyObject *p);

목록 작업 함수:
PyObject * PyList_New(Py_ssize_t len);
int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item);
PyObject * PyList_GetItem(PyObject *list, Py_ssize_t 인덱스);
int PyList_Append(PyObject *list, PyObject *item);
int PyList_Sort(PyObject *list);
int PyList_Reverse(PyObject *list);
Py_ssize_t PyList_Size(PyObject *list );

튜플 연산 함수:
int PyTuple_New(Py_ssize_t len);
int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o);
PyObject * PyTuple_GetItem(PyObject *p , Py_ssize_t pos ; *p, PyObject *key, PyObject *val);
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);

PyObject* PyDict_GetItem(PyObject *p, PyObject *key );

PyObject* PyDict_GetItemString(PyObject *p, const char *key);
//PyDict_SetItemString에 해당
int PyDict_DelItem(PyObject *p, PyObject *key);
int PyDict_DelItemString(PyObject * p, char * key);
//PyDict_SetItemString에 해당
int PyDict_Next(PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
PyObject* PyDict_Items(PyObject *p );
PyObject* PyDict_keys(PyObject *p);
PyObject* PyDict_Values(PyObject *p);

C/C++에서 Python 객체를 사용하면 참조 계산 문제를 올바르게 처리해야 합니다. 그렇지 않으면 쉽게 메모리 누수로 이어집니다. 목록, 튜플, 사전 등을 생성하기 위해 Python/C API의 함수를 사용할 때, Py_CLEAR() 및 Py_DECREF()와 같은 매크로를 사용하여 해당 객체에 대한 작업을 완료한 후 이러한 객체를 삭제해야 합니다. 프로토타입은 다음과 같습니다:
void Py_CLEAR(PyObject *o);
void Py_DECREF(PyObject *o);
이 중 Py_CLEAR 함수의 경우 매개변수는 NULL 포인터가 될 수 있습니다. 작업이 수행되지만 Py_DECREF 함수는 NULL 포인터가 될 수 없습니다. 그렇지 않으면 오류가 발생합니다.

PyImport_Import() 함수를 사용하여 C로 Python 모듈을 가져오고 모듈 객체를 반환합니다. 함수 프로토타입은 다음과 같습니다.
PyObject* PyImport_Import(PyObject *name);
PyModule_GetDict() 함수는 Python 모듈의 함수 목록을 얻고 사전을 반환할 수 있습니다. 사전의 키워드는 함수 이름과 값입니다. 함수 호출 주소입니다. 프로토타입은 다음과 같습니다:
PyObject* PyModule_GetDict(PyObject *module);
PyObject_CallObject() 함수와 PyObject_CallFunction() 함수를 사용하여 C에서 Python의 함수를 호출합니다. 프로토타입은 다음과 같습니다:
PyObject* PyObject_CallObject(PyObject * callable_object, PyObject *args);
//args는 튜플 형식입니다
PyObject* PyObject_CallFunction(PyObject *callable, char *format, …);
//format은 매개변수입니다 "iss" 유형과 같이 지정된 매개변수
가 뒤따릅니다. PyCallable_Check(func)를 사용하여 함수가 호출될 수 있는지 여부를 결정할 수 있습니다.



성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.