C/C++에 Python 포함

黄舟
풀어 주다: 2016-12-17 16:32:06
원래의
1917명이 탐색했습니다.

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 &#39;hi, python!&#39;");
    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를 반환할 수 있습니다. 할 수 있다.

위 내용은 C/C++에 Python을 삽입한 내용입니다. 더 많은 관련 글은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!


관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿