Windows에서pybind 11을 통해 Python에서 C++ 코드를 호출합니다.

16646 단어 pybind11PythonC++

오늘


파이썬에서 C++를 호출하려는 다양한 이유!!!수요량이 일정할 때입니다. 그리고 Windows에서는 오늘 이 소망을 실현하는 수단 중 하나로pybind11을 사용하는 방법을 소개합니다.
맥, 리눅스의 사례는 이미 소개됐다.
  • pybind 11에서pyton에서 C++ 함수 사용하기
  • [python 고속화] pybind 11 기반 c++ 삽입

  • C++ 프로그램에서pybind11로 Python을 삽입해 보십시오

    여기 사용하는 도구.


  • pybind11
  • Python3.5(Miniconda)
  • Visual Studio 2017
  • 문서:
    On Windows, only Visual Studio 2015 and newer are supported since pybind11 relies on various C++11 language features that break older versions of Visual Studio.
    2018년입니다. 새로운 Visual Studio를 사용하세요.

    준비

    > pip install pybind11
    
    이렇게 하면 된다. 피빈드 11은 머리로만 구성되며, 취향에 따라git clone으로 소스를 빼는 것도 가능하다.
    여기에는 pip install의 방법으로 도입한 것으로 가정하고 계속 진행한다.

    소스를 어디에 넣었는지 확인하세요.


    pybind11의 머리글을 찾습니다.
    나의 파이썬 패스는 아래와 같다.

    C:\ProgramData\Miniconda3\include 바로 아래에 설치되어 있는 환경에 대한 단서를 찾을 것입니다.

    C:\ProgramData\Miniconda3의 경로 부분은 여러분의 환경과 장소에 따라 아래에서 적절하게 교체하십시오.
    겸사겸사 C:\ProgramData\Miniconda3\libs를 보십시오.

    이러한 경로는 Visual Studio 설정에 사용됩니다.

    Visual Studio 시작


    Visual Studio를 시작하여 구해 프로젝트를 만듭니다. 이전에 C++ 코드를 호출할 때의 모듈 이름을 고려하십시오.
    이 가정은 나중에 모듈 이름 pybindtest 으로 파이톤에서 호출될 것입니다. 즉,
    import pybindtest
    
    가설로 사용하다.
    구해기를 만들고 프로젝트 이름을 pybindtest 로 설정합니다. 빈 프로젝트를 지정합니다.

    속성 편집


    솔루션 리소스 매니저(대략 IDE 화면 오른쪽)의 pybindtest 프로젝트 속성부터 다양한 설정을 수행합니다.


    설정 형식을 동적 라이브러리로 설정합니다. 대상 확장자를pyd로 변경합니다.

    인라인 디렉토리 편집


    위에서 pybind 11의 원본 위치,libs의 위치를 찾았기 때문에 이 경로를 디렉터리와 라이브러리 디렉터리에 각각 추가합니다.

    자가용차 설치


    -> 의존 파일의 일부pythn35를 입력하십시오.lib을 추가합니다.

    소스 및 머리글 파일 추가


    상기 항목은 이미 준비가 다 되었다.
    그 다음에 소스를 추가한다.
    여기는 소스입니다.cpp Header.각각 h를 예로 들다.
    Header.h
    #include<vector>
    #include <utility>
    using namespace::std;
    
    int add(int x, int y);
    
    class POINT {
    private:
        int x;
        int y;
    public:
        int sum;
        POINT(pair<int, int> xy) { this->x = xy.first; this->y = xy.second; this->sum = this->x + this->y; }
        POINT(int x, int y) { this->x = x; this->y = y; this->sum = x + y; }
        int X() { return x; }
        int Y() { return y; }
        POINT operator+(const POINT &v) const { return POINT(this->x + v.x, this->y + v.y); }
        std::string toString() const {
            return "(" + std::to_string(this->x) + ", " + std::to_string(this->y) + ")";
        }
    };
    
    Source.cpp
    //References:
    //http://pybind11.readthedocs.io/en/stable/classes.html
    //https://qiita.com/ignis_fatuus/items/c7523c0fe2bc2f415d50
    //https://qiita.com/exy81/items/e309df7e33d4ff20a91a#_reference-c8a52580111447fade09
    //http://pybind11.readthedocs.io/en/stable/advanced/classes.html#operator-overloading
    //http://pybind11.readthedocs.io/en/stable/classes.html#overloaded-methods
    
    #include <pybind11/pybind11.h>
    #include <pybind11/stl.h> // vector用
    #include <pybind11/operators.h>//operator
    #include "Header.h"
    
    
    using namespace::std;
    
    int add(int x, int y) {
        return x + y;
    }
    
    namespace py = pybind11;
    PYBIND11_MODULE(pybindtest, m) {
        m.doc() = "pybind11 example plugin";
        m.def("add", &add);
        py::class_<POINT>(m, "POINT")
            .def(py::init<int, int>())
            .def(py::init<pair<int, int>>())
            .def_readwrite("sum", &POINT::sum)
            .def_property_readonly("x", &POINT::X)
            .def_property_readonly("y", &POINT::Y)
            .def(py::self + py::self)
            .def("__repr__", &POINT::toString);
    }
    
    PYBIND11_MODULE(pybindtest, m)의 부분에서 프로젝트 이름을 지정하지 않으면 Python 측이 호출할 때 실패합니다.
    한 걸음 더.
    나중에 구해기를 만들어 주세요.
    pybindtest.pyd만 있으면 돼.

    From Python 호출


    준비됐습니다. 다음 코드를 호출할 수 있다면 완성됩니다.
    test.py
    import pybindtest
    from pybindtest import add, POINT
    
    print('doc=', pybindtest.__doc__)
    x1, y1 = 1, 2
    print("add({},{})=".format(x1, y1), pybindtest.add(x1, y1))
    
    x2, y2 = 3, 4
    
    p = POINT(x1, y1)
    q = POINT([x2, y2])
    
    print('p=', p)
    print('q=', q)
    print('p+q=', p+q)
    print('p.x,p.y=', p.x, p.y)
    
    C++ 측의 POINT 클래스의 구조기는 여러 개를 정의할 수 있지만 지금은 Python 측의 호출에 대응할 수 있다고 생각합니다. 그리고 C++ 측에서 POINT 클래스의 + 산수를 정의하면 Python과 저의 POINT 클래스 사이에 가산 연산을 할 수 있습니다.

    위에 쓰여 있다.
    또 defproperty_readonly를 사용하면 파이톤에서도 C++의 개인 기능을 유지할 수 있습니다.

    위에 쓰여 있다.

    감상


    의외로 요즘은 문서가 간단하고 편리하다고 느낀다.
    이전에 Boost를 사용했다면 앞으로도 pybind 11이 시야에 들어왔을 것이다.
    그게 다야.

    좋은 웹페이지 즐겨찾기