prosource

Python을 공유 라이브러리에 연결하기 위해 Cython 사용

probook 2023. 7. 7. 19:07
반응형

Python을 공유 라이브러리에 연결하기 위해 Cython 사용

다음에 작성된 타사 라이브러리를 통합하려고 합니다.C나와 함께python응용 프로그램 사용Cython저는 테스트를 위해 파이썬 코드를 모두 작성했습니다.이 설정에 대한 예제를 찾는 데 어려움을 겪고 있습니다.

나는 있습니다pyd/pyx수동으로 만든 파일입니다.제3자가 저에게 다음과 같은 정보를 제공했습니다.header file (*.h)그리고 ashared library (*.so)제가 아는 한, 다른 의존성은 없습니다.다음을 사용하여 설정하는 방법에 대한 예를 제공할 수 있습니까?Cython그리고.disutils?

감사해요.

물론이죠!

(다음에서, 저는 당신이 이미 어떻게 대처해야 하는지 알고 있다고 가정합니다.cimport그리고 사이의 상호 작용..pxd그리고..pyx만약 완전히 그렇지 않다면, 요청만 하면 그 부분도 개발하겠습니다.)

샘플(제가 만든 C++ 프로젝트에서 가져온 것이지만 C 프로젝트는 거의 동일하게 작동합니다):

Distutils 설정 파일:

생성할 내선 번호를 호출한다고 가정합니다.myext그리고 타사 공유 라이브러리는libexternlib.so(여기서 lib* 접두사 참고)...

# setup.py file
import sys
import os
import shutil

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

# clean previous build
for root, dirs, files in os.walk(".", topdown=False):
    for name in files:
        if (name.startswith("myext") and not(name.endswith(".pyx") or name.endswith(".pxd"))):
            os.remove(os.path.join(root, name))
    for name in dirs:
        if (name == "build"):
            shutil.rmtree(name)

# build "myext.so" python extension to be added to "PYTHONPATH" afterwards...
setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [
        Extension("myext", 
                  sources=["myext.pyx",
                           "SomeAdditionalCppClass1.cpp",
                           "SomeAdditionalCppClass2.cpp"
                       ],
                  libraries=["externlib"],          # refers to "libexternlib.so"
                  language="c++",                   # remove this if C and not C++
                  extra_compile_args=["-fopenmp", "-O3"],
                  extra_link_args=["-DSOME_DEFINE_OPT", 
                                   "-L./some/extra/dependency/dir/"]
             )
        ]
)           

참고: 사용자의 외부.so파일은 를 통해 연결됩니다.libraries옵션:

libraries=["externlib"]   # Without the 'lib' prefix and the '.so' extension...

참고: 더sources옵션을 사용하여 일부 추가 소스 파일을 컴파일할 수 있습니다.

중요: myext.pxd(와 혼동하지 않음).pydWindows 자료) 및myext.pyx동일한 디렉토리에 있어야 합니다.컴파일 시 정의 파일(존재하는 경우)이 먼저 처리됩니다(추가).

그런 다음 다음과 같이 실행합니다.

디렉토리를 다음이 포함된 디렉토리로 변경한 후myext.pxd,당신의.myext.pyx상기와 마찬가지로setup.py스크립트:

# setup.sh
# Make the "myext" Python Module ("myext.so")
CC="gcc"   \
CXX="g++"   \
CFLAGS="-I./some/path/to/includes/ -I../../../DEPENDENCIES/python2.7/inc -I../../../DEPENDENCIES/gsl-1.15"   \
LDFLAGS="-L./some/path/to/externlib/"   \
    python setup.py build_ext --inplace

위치:

  • libexternlib.so에 위치하는 것으로 가정함./some/path/to/externlib/
  • yourheader.h에 위치하는 것으로 가정함./some/path/to/includes/

참고: 를 사용하여 설정할 수도 있습니다.extra_compile_args옵션:

extra_compile_args=["-I./some/path/to/includes/", "-fopenmp", "-O3"]

참고: 를 사용하여 설정할 수도 있습니다.extra_link_args옵션:

extra_link_args=["-L./some/path/to/externlib/", "-DSOME_DEFINE_OPT", "-L./some/extra/dependency/dir/"]

빌드에 대한 배포가 완료되면 몇 가지 새로운 파일, 특히myext.cpp,myext.h그리고 가장 중요한 것은,myext.so.

그 후에, 당신은 가도 좋습니다.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./some/path/to/externlib/
export PYTHONPATH=$PYTHONPATH:./some/path/to/myext/

# Run some script requiring "myext.so"
python somescript.py

새로 만든 Python 확장자를 이름으로 가져올 수 있는 위치:

# somescript.py
import myext
from myext import PySomeFeature
...

최적화에 대한 참고: 기본적으로-O2확장을 컴파일하는 데 사용되지만, 이것은 오버로드될 수 있습니다(위 설정 참조).-O3지정됨).

Cython 경로에 대한 참고: Cython이 사용자 지정 디렉토리에 설치된 경우 먼저 환경에 추가할 수 있습니다.

PYTHONPATH=$PYTHONPATH:../../../DEPENDENCIES/Cython-0.18 export PYTHONPATH;
PATH=$PATH:../../../DEPENDENCIES/Cython-0.18/bin; export PATH;

음, 제가 요점을 다뤘기를 바랍니다...

언급URL : https://stackoverflow.com/questions/16993927/using-cython-to-link-python-to-a-shared-library

반응형