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
(와 혼동하지 않음).pyd
Windows 자료) 및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
'prosource' 카테고리의 다른 글
분기 git를 삭제하면 기록에서 제거됩니까? (0) | 2023.07.07 |
---|---|
테이블의 외부 키 관계 쿼리 (0) | 2023.07.07 |
.NET MySql 커넥터를 사용하여 mariadb에서 DELMITER를 사용하는 방법은 무엇입니까? (0) | 2023.07.07 |
Apache POI, 새 셀 작성이 행 스타일을 재정의합니다. (0) | 2023.07.07 |
mongodb에 색인을 만들 수 없습니다. "키가 너무 커서 색인화할 수 없습니다." (0) | 2023.07.07 |