Numpy Boost 1.66.0 Visual Studio 2017 Edition 가져오기

9695 단어 boostPythonC++

오늘


Boost를 사용하여 Python에서 C++를 호출하려는 소망을 실현하기 위해
Python에서 C++ 호출numby 사용하기
라는 내용으로 다음 조합을 시도해보고,
  • Visual Studio 2017
  • Boost (1.66.0)
  • Boost 가져오기


  • 방문http://www.boost.org/.다음 페이지에서 다운로드할 수 있는 페이지로 이동합니다.

  • boost_1_66_0.zip 다운로드 및 확장
    다음 그림과 같이 Windows 파일을 다운로드합니다.

    해동 후 간단히 보기 위해 직접 C반 밑에 놓다
  • 명령 실행
    명령 프롬프트를 시작하고 다음을 수행합니다
  • .
    > bootstrap.bat 
    > b2 toolset=msvc threading=multi variant=debug,release link=static runtime-link=static address-model=64 --stagedir=stage/x64 -j 8
    
    -j는 구축에 사용되는 핵심 수에 해당하므로 각각의 PC 환경에 따라 변경된다.
    기타 옵션은 다음과 같습니다.
    boost 가져오기(Windows 10, Visual Studio 2015)
    쓸모가 있는 것 같다.
    4. 생산물 확인--stagedir=stage/x64로 지정했기 때문에 라이브러리 등의 출력 결과를 확인합니다.
    - libboost_numpy_....
    - libboost_python3_....
    이런 게 있으면 행복해.

    Visual Studio 2017 시작


    다음은 x64가 Release 플랫폼으로 구성된 경우에만 설명합니다.
    C++ -> 빈 항목을 선택하고 항목 이름을 callcfrompy 로 설정합니다. 이 이름은 Python의 모듈로 사용할 이름을 지정합니다.
    import callcfrompy
    
    이렇게 하면 돼.
    이후 프로젝트 속성을 설정하고 Pybind 11이 설정한 것과 비슷한 부분도 있다.
    See also
  • Windows에서pybind 11을 통해 Python에서 C++ 코드를 호출합니다.
  • 엔지니어링 속성 설정


    구성 속성 -> 다음 항목을 모두 수정합니다.
  • 구조의 종류ダイナミック ライブラリ(.dll)
  • 타겟 확장자.pyd
  • C/C++-> 코드 생성 중ランタイム ライブラリ에서 マルチスレッド(/MT)로 변경되었습니다.

    VC++ 디렉터리에 각자의 환경 설정에 따라 디렉터리와 라이브러리 디렉터리를 포함합니다.
    내가 추가한 바와 같이:
  • 카탈로그 포함
  • C:\boost_1_66_0
  • C:\Miniconda3\include
  • 라이브러리 디렉토리
  • C:\boost_1_66_0\stage\x64\lib
  • C:\Miniconda3\libs

  • 샘플 코드 작성
    원자재는 Python의 Boost를 C++로 확장합니다.NumPy 자습서(실습 편)부터 인용한다.
    /*
    Call C++ From Python
    Reference:
    http://tadaoyamaoka.hatenablog.com/entry/2017/05/25/234934
    https://qiita.com/takuya-ki/items/3555ab17f9cea534e13b
    https://qiita.com/termoshtt/items/81eeb0467d9087958f7f
    */
    
    #define BOOST_PYTHON_STATIC_LIB
    #define BOOST_NUMPY_STATIC_LIB
    #include <boost/python/numpy.hpp>
    #include <stdexcept>
    #include <algorithm>
    
    namespace p = boost::python;
    namespace np = boost::python::numpy;
    
    /* 2倍にする */
    void mult_two(np::ndarray a) {
        int nd = a.get_nd();
        if (nd != 1)
            throw std::runtime_error("a must be 1-dimensional");
        size_t N = a.shape(0);
        if (a.get_dtype() != np::dtype::get_builtin<float>())
            throw std::runtime_error("a must be float32 array");
        float *p = reinterpret_cast<float *>(a.get_data());
        std::transform(p, p + N, p, [](float x) { return 2 * x; });
    }
    
    BOOST_PYTHON_MODULE(callcfrompy) {
        Py_Initialize();
        np::initialize();
        p::def("mult_two", mult_two);
    }
    
    이걸 소스에 넣고 구축해.

    생성하면callcfrompy.pyd OK.
    그리고 같은 디렉터리에 다음 호출 코드를 만듭니다.
    test.py
    from callcfrompy import mult_two
    import numpy as np
    
    
    def main():
        arr = np.array([1, 2, 3, 4, 5]).astype(np.float32)
        mult_two(arr)
        print(arr)
    
    if __name__ == '__main__':
        main()
    
    실행 결과로 배열된 값이 2배가 되면 된다.

    좋은 웹페이지 즐겨찾기