2017-05-09 9 views
1

그래서 파이썬으로 작성된 함수를 가지고 있고 Cython 문서 'distutils를 사용하여 Cython 모듈 만들기'의 단계를 수행했습니다. 그러나 C/C++에 임베디드되도록 Python (임포트에 의해)에서 작동하는 모듈을 사용하는 방법이 나에게는 불분명하다. C/C++ 코드를 컴파일하여 Cython을 사용하여 파이썬 생성 모듈을 가져오고 싶습니다. (2 단계 프로세스 인 것 같습니다)파이썬에서 C/C++ 메인 파일로 Cython 생성 모듈을 가져 오는 방법은 무엇입니까? (C/C++ 프로그래밍)

* 명확히하기 위해 이미 모든 단계를 수행하고 a에서 파이썬 모듈을 만들었습니다. pyx 소스 파일. 하지만 내 질문은 기존 C/C++ 파일에 해당 모듈을 통합하는 방법입니다.

답변

0

Cython tutorial에서 Cython을 사용하는 방법은 입니다. 컴파일 된 C 모듈이있는 Python.

  1. 별도의 Cython 모듈은 Python으로 작성되었습니다. Cython은 이것을 C로 쓰여진 것처럼 정적으로 컴파일 된 모듈로 변환합니다.
  2. setup.py 파일을 사용하여 *.so 공유 라이브러리로 Cython 모듈을 컴파일합니다. 이 공유 라이브러리는 실제로 파이썬 모듈입니다. 일반 파이썬 스크립트 import 반면에 당신이 원하는 경우 C.으로 파이썬을 확장

    import helloworld

사이 썬은 일반적으로 에 사용되는 사이 썬 모듈에서

python setup.py build_ext --inplace

  • embed C 프로그램에 파이썬 코드도 가능합니다. 먼저 official docs on embedding Python into C을 살펴 보는 것이 좋습니다.

    여기에 어떻게 수행하는지 설명하는 github project과 그 수행 방법을 설명하는 a blog이 있습니다.

    # cymod.pyx 
    from datetime import datetime 
    
    cdef public void print_time(): 
        print(datetime.now().ctime()) 
    

    cymod.c-cymod.pyx을 cythonizing하는 cymod.h뿐만 아니라 생성됩니다

  • +0

    나는 위의 모든 단계를 완료했습니다. 내 질문은 현재의 C/C++ 파일에 해당 모듈 (귀하의 경우 helloworld)을 통합하는 방법입니다. 그 기능을 사용하고 싶습니다. 댓글을 주셔서 감사합니다! –

    +0

    확인. 파이썬을 C에 삽입하는 방법에 대한 몇 가지 링크를 추가했습니다. Cython을 정기적으로 사용하는 것은 C로 파이썬을 확장하는 것이라고 생각합니다. – MrJLP

    2

    는 그냥 예를 들어 cdef public

    으로 C/C++에서 호출 할 물건을 선언합니다.

    그런 다음 라이브러리를 만듭니다 (예 : cymod.lib). 는 C 코드에서

    (main.c를)

    #include "Python.h" 
    #include "cymod.h" 
    
    
    int main(int argc, char **argv) 
    { 
    Py_Initialize(); 
    
    PyInit_cymod(); // in cymod.h 
    print_time(); // call the function from cython 
    
    Py_Finalize(); 
    return 0; 
    } 
    

    이 컴파일 및 실행 (메인 .exe)

    참고 : 메인 .exe이 높은 파이썬 환경에 바인딩, 하나는 수도 cannot find pythonxx.dll, Fatal Python error: Py_Initialize: unable to load the file system codec과 같은 오류가 발생합니다. 이 사이트에는 많은 솔루션이 있습니다.

    +0

    .lib는 어떻게 작성합니까? –

    +1

    @Steven G 커맨드 라인에서 VS 컴파일러를 사용합니다. 예를 들어'call vcvarsall amd64' 'cl/c/nologo cymod.c/Ipython-header-path' 'lib cymod.obj' – oz1