기존 C++ 라이브러리에 대한 Python 바인딩을 작성해야하는 작업이 있습니다. SWIG는 Python뿐 아니라 Java 및 Perl과 같은 언어도 지원하므로 SWIG를 사용하고 있습니다. 나는 비교적 새로운 SWIG이므로 의심 스럽습니다. 파이썬 2.7과 파이썬 3.x에서 파이썬 라이브러리가 지원되기를 바랍니다. 그러나 나는 이것을 어떻게하는지에 대해 아무런 생각이 없습니다. 누군가가 나를 제안 할 수 있다면. 어떤 도움을 주시면 감사하겠습니다. 원하는 경우 세부 정보를 요청할 수 있습니다.SWIG를 사용하여 python2 및 python3 용 모듈 만들기
지금까지 시도한 내용.
이것은 내 코드 파일입니다.
/* example.c file */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int my_mod(int n, int m) {
return n % m;
}
int sieve(int number) {
int* arr = malloc(sizeof (int) * (number + 10));
int* prime = malloc(sizeof (int) * (number + 10));
/* printf("Size of arr: %lu", sizeof(arr));
printf("Size of int: %lu", sizeof(int)); */
memset(arr, 0, sizeof(int) * (number + 10));
int counter = 0;
prime[counter++] = 2;
arr[0] = arr[1] = 0;
for (int i = 3; i * i <= number; i += 2) {
if (!arr[i]) {
for (int j = i + i; j < number; j += i) {
arr[j] = 1;
}
}
}
for (int i = 3; i < number; i += 2)
if (!arr[i])
prime[counter++] = i;
// free(arr);
// free(prime);
return counter;
}
그리고 내 인터페이스 파일은 python3와 잘 작동하지만
로 오류 로그와 python2에 실패 위의 편집 형식 모듈에서 컴파일
swig -python example.i
gcc -fpic -c example.c example_wrap.c $(pkg-config --cflags --libs python3)
gcc -shared example.o example_wrap.o -o _example.so
에 대한
/* example.i */
%module example
%{
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
extern int my_mod(int n, int m);
extern int sieve(int number);
%}
extern int my_mod(int n, int m);
extern int sieve(int number);
내 단계입니다
ImportError: ./_example.so: undefined symbol: PyUnicode_FromFormat
내가 컴파일 이하로 사용하는 경우는 모듈보다
swig -python example.i
gcc -fpic -c example.c example_wrap.c $(pkg-config --cflags --libs python2)
gcc -shared example.o example_wrap.o -o _example.so
은 python2와 협력하고 명령하지만 오류 메시지보다 더 python3에서 가져올 때 오류가 $(pkg-config --cflags --libs pythonX)
I 때문에보다 확신
ImportError: /home/deepanshu/env/swig/env/src/deep/_example.so: undefined symbol: PyInstance_Type
입니다 X의 위치에 버전을 지정하고 있지만 파이썬 버전 모두에서 내 모듈이 제대로 작동하는지 어떻게 확인할 수 있습니까?
나는 -py3
플래그를 사용했지만 위의 플래그가 지정된 파이썬 버전 둘 모두에 대해 모듈 작동을 할 수 없었습니다.
Python 2.7과 Python 3.x를 동시에 링크 할 수 없습니다. 두 버전을 모두 지원하려면 실행 파일이 필요하며 생성 된 Python 파일에서 Python 버전에 분기를 도입해야합니다. –