2017-05-10 13 views
3

私は既存の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バージョンの両方のためのモジュールを動作させることができませんでした。

+0

Python 2.7とPython 3.xの両方に同時にリンクすることはできません。両方のバージョンをサポートしたい場合は、実行可能ファイルを生成し、生成されたPythonファイルにPythonバージョンのブランチを導入する必要があります。 –

答えて

0

Cの拡張機能は、python3とpython2では同じように動作しません。このリンクは、Python 2と3(swigを使用しない)の両方でライブラリを動作させるために、Cレベルで何をする必要があるのか​​を特定するのに役立ちます。私はどうなるのかガブガブ飲むと、使用http://python3porting.com/cextensions.html

の命名規則ピップホイールを使用することである。 そうhttps://packaging.python.org/tutorials/distributing-packages/#packaging-your-project

、私はのpython3のためのライブラリをパッケージ化し、パッケージには、車輪の命名標準(」https://www.python.org/dev/peps/pep-0425/#id1に従ってくださいになるだろう"" py3-none-any ")、Python2のライブラリを作って同じ戦略(" py2-none-any ")を使ってパッケージ化してください。それをPypiにアップロードすることができ、pipはpython2にはpy2を使用し、python3にはpy3を使用する必要があることを知ります。

関連する問題