私は既存のC++ライブラリのPythonバインディングを書く必要があります。 SWIGはPythonだけでなく、JavaやPerlなどの言語もサポートしているので、SWIGを使用しています。私はSWIGで比較的新しいので、疑いがあります。 Python 2.7とPython 3.xの下で私のPythonライブラリをサポートしたいです。しかし、私はこれを行う方法については何も考えていません。だから誰でも私を示唆することができます。どんな助けもありがとう。あなたが望むなら、あなたは私に詳細を尋ねることができます。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の場所でバージョンを指定していますが、私のモジュールが両方のPythonバージョンで動作することを確認するにはどうすればよいですか?
IはSWIGの-py3
フラグを試みたが、私は上記の指定されたフラグとPythonバージョンの両方のためのモジュールを動作させることができませんでした。
Python 2.7とPython 3.xの両方に同時にリンクすることはできません。両方のバージョンをサポートしたい場合は、実行可能ファイルを生成し、生成されたPythonファイルにPythonバージョンのブランチを導入する必要があります。 –