2017-10-27 18 views
1

저는 파이썬이 내장 된 C++ 라이브러리를 개발 중입니다. 내가 뭘하고 싶은지 정적으로 파이썬 라이브러리를 연결하는 것입니다, 그래서 프로덕션 서버로 전환하면 구성 문제가되지 않습니다. 지금까지 나는 libpython3.5m.a을 정적으로 링크 할 수있었습니다 (패키지 라이브러리가 -fPIC 플래그로 컴파일되지 않았기 때문에 소스에서 파이썬을 빌드해야했습니다). 그러나, 나는이 문제에 온, 그것은 보인다, 더 NumPy와이 없다 : 그,Python 라이브러리를 Numpy로 C (C++)에 정적으로 연결

ImportError: numpy.core.multiarray failed to import 

그리고이 오류가 import_array1() 매크로에 의해 발생 : 내 라이브러리를 사용하는 응용 프로그램을 실행하면 오류가 날 프롬프트 (AFAIK)는 numpy 루틴을 C++로 임포트하는 데 사용됩니다. libnpymath.alibnpysort.a을 연결해 보았습니다. numpy 빌드 디렉토리에서 찾았지만 아무 소용이 없습니다. 정적 링크가 가능하고 어떻게 할 수 있는지 알고 있습니까? 나는 numpy가 C로 쓰여졌 기 때문에 가능해야한다고 생각한다.

+0

질문의 첫 번째 부분은 왜 dll 파일을 사용하지 않습니까?! dll 파일을 호출하고 ctypes 모듈과 함께 함수를 사용할 수 있습니다 ... 또한 sys.path.append ('./ yourpath/yourpath') 함수를 사용하여 sys 모듈과 정적 링크를 수행 할 수 있습니다 다음 자신의 모듈을 가져올 ... – DRPK

+0

@ DRPK 문제는 다른 라이브러리 (나는 리눅스에있어, 그래서 .dll보다는 오히려.) 나는 우분투 16에서 개발하고, 서버는 데비안 스트레치이며 libc.so (C++ 인 라이브러리)의 두 가지 버전이 있습니다. 하나만 컴파일하고 다른 하나는 사용할 수 없으므로 정적으로 링크하고 싶습니다. 그리고 파이썬도 마찬가지입니다. 나는 3.5, 3.4있다 ... –

답변

1

이것은 파이썬 핵심 일 뿐이며, 모든 파이썬 라이브러리를 제외 할 것이다. 여전히 모든 Python 코드를 제공해야합니다.

...since numpy is written in C...

올바르지 않습니다. NumPy는 C에서 절반, 파이썬에서 절반 정도 작성됩니다. numpy.core.multiarray이 C로 작성 되었기 때문에 C 부분이 여기에로드되지 않는 부분 인 것처럼 보입니다. 보통은 NumPy의 Python 부분에서 가져 오게됩니다.

어쨌든 C 코드로 링크하는 것은 충분하지 않습니다. C 코드에서 내 보낸 연관된 파이썬 모듈을 초기화해야합니다. 정적 링크가 없으면 Python은 multiarray.so 파일을 올바른 위치에서 찾은 다음로드합니다. 정적으로 Python을 빌드 할 때는 일반적으로 Python으로 정적으로 컴파일하려는 모듈로 Modules/Setup.local 파일을 편집하게됩니다. 그러나 이것은 NumPy와 같은 임의의 타사 모듈과 함께 작동하도록 설계되지 않았습니다. 참조 : 당신은 파이썬의 동일한 버전 모두 개발 및 생산 시스템에서 실행 있는지 확인하려는 경우 Compile the Python interpreter statically?


솔직히, VIRTUALENV처럼,이 작업을 수행하는 크게 쉬운 방법이 있습니다. CPython은 단순히 정적으로 링크되도록 설계되지 않았습니다.