C/C++에 Python을 포함하는 것은 비교적 간단합니다. 먼저 VC에 Python의 포함 파일 디렉터리와 lib 파일 디렉터리를 추가해야 합니다.
VC6.0에서 엽니다.
도구->옵션->디렉터리->디렉토리 표시
for, Python 설치 디렉터리의 inlude 디렉터리를 include files 항목에 추가하고 libs 디렉터리를 library에 추가합니다.
파일 항목.
VC2005에서 도구->옵션->프로젝트 및 솔루션->VC++ 디렉토리를 열고 동일한 작업을 수행합니다.
코드는 다음과 같습니다:
//在debug下执行出错,“无法找到python31_d.lib文件”,后查到原因是:在debug下生成必须要有python31_d.lib文件,否则只能在release下生成 #include <python.h> int main() { Py_Initialize(); PyRun_SimpleString("Print 'hi, python!'"); Py_Finalize(); return 0; }
Py_Initialize 함수 프로토타입은: void
Py_Initialize(), 이 함수는 Python 스크립트를 내장할 때 사용해야 하며 Python 인터프리터를 초기화하고 다른 Python/C를 사용할 때 사용됩니다.
이 함수는 API 전에 호출되어야 합니다. Py_IsInitialized 함수를 사용하여 초기화가 성공했는지 확인하고 성공하면 True를 반환할 수 있습니다.
PyRun_SimpleString 함수 프로토타입은 int입니다.
PyRun_SimpleString(const char
*명령), Python 코드를 실행하는 데 사용됩니다. 참고: 명령문 사이에 들여쓰기를 유지해야 합니까?
Py_Finalize 함수 프로토타입이 무효입니다.
Py_Finalize(), Python 인터프리터를 닫고 인터프리터가 점유한 리소스를 해제하는 데 사용됩니다.
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 *형식,
…..);
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
index);
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);
int
_PyTuple_Resize(PyObject **p, Py_ssize_t newsize);
//** 포인터라는 점에 유의하세요
사전 연산 함수:
PyObject * PyDict_New();
int PyDict_SetItem(PyObject
*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,
문자 *형식,
...);
//format은 "iss"와 유사한 매개변수 유형이며 그 뒤에 지정된 매개변수가 옵니다
PyCallable_Check(func)를 사용하여 함수를 호출할 수 있는지 확인하고, 호출되면 True를 반환할 수 있습니다. 할 수 있다.