파이썬 스크립트 속도를 높이기 위해 ac 루틴을 작성하려고합니다.
내 방법을 증명하기 위해 먼저 간단한 테스트 c 함수를 작성하고 라이브러리로 컴파일했습니다. 테스트 함수의 코드는 다음과 같습니다.
void cttest(void);
#include <stdio.h>
void cttest()
{
printf("This is the shared module|n");
return;
}
이 코드를 'ct_test.cc'파일에 저장했습니다.
그런 다음이 코드를 다음과 같이 컴파일했습니다.
g++ -shared -fPIC -o /home/paula/libs/libcttest.so ct_test.cc
오류나 경고를주지 않았습니다.
그런 다음 ipython을로드하고 다음을 입력했습니다.
import ctypes as ct
test=ct.CDLL("/home/paula/libs/libcttest.so")
이제 함수에 액세스하려고하면 ( 'test.'를 입력 한 다음 탭을 눌러) 아무 일도 일어나지 않습니다.
이렇게하면 :
내가 무엇을 잘못하고 있지?
오, 차이가있을 경우를 대비하여 :
운영체제 : xubuntu 14.10 Python : 2.7.8 ipython : 2.3.0 g ++ : 4.9.1
두 가지 문제가 있습니다.
첫 번째 문제에 대한 해결책은 사소한 것입니다. 전체 이름을 사용하고 자동 완성에 의존하지 마십시오. 두 번째에 대한 최소 3 가지 해결책이 있습니다. 여기에 최선에서 최악까지 작성했습니다.
gcc
대신 g++
).extern "C"
C ++ 컴파일러가 함수 이름을 왜곡하지 않도록 강제하는 데 사용 합니다.
extern "C" void cttest(void);
extern "C"
{
void cttest()
{
printf("This is the shared module\n");
return;
}
}
파이썬에서 잘린 C ++ 이름을 사용하세요.이 경우에는 _Z6cttestv
이것이 작동하는지 증명하기 위해 Ubuntu 14.04에서 시도했습니다.
gcc -shared -fPIC -o libcttest.so test.c
그리고 ipython에서 사용 :
ipython
Python 2.7.6 (default, Mar 22 2014, 22:59:38)
Type "copyright", "credits" or "license" for more information.
IPython 1.2.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import ctypes as ct
In [2]: test=ct.CDLL('./libcttest.so')
In [3]: test.cttest()
This is the shared module
Out[3]: 26
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다