簡體   English   中英

使用SWIG為python2和python3創建模塊

[英]Creating a module for python2 and python3 with SWIG

我有一個任務,我必須為現有的C ++庫編寫Python綁定。 由於SWIG不僅支持Python,還支持Java和Perl等語言,因此我使用的是SWIG。 我在SWIG比較新,所以我有一個疑問。 我希望我的python庫在Python 2.7和Python 3.x下可以支持。 但我不知道如何做到這一點。 所以,如果有人可以建議我。 任何幫助,將不勝感激。 如果需要,您可以向我詢問更多詳細信息。

到目前為止我嘗試過的。

這是我的代碼文件。

/* 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;
}

我的界面文件是

/* 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);

我的編譯步驟

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

在上面的編譯格式模塊與python3工作正常但在python2中失敗,錯誤日志為

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中導入而不是錯誤消息時

ImportError: /home/deepanshu/env/swig/env/src/deep/_example.so: undefined symbol: PyInstance_Type

我確定錯誤是因為$(pkg-config --cflags --libs pythonX)我在X的位置指定版本但是如何確保我的模塊適用於兩個Python版本?

我嘗試了swig的-py3標志,但是我無法使模塊適用於具有上述指定標志的Python版本。

C擴展在python3與python2中的工作方式不同。 此鏈接可以幫助您確定在C級別上需要執行的操作,以使庫適用於python 2和3(不使用swig)。 http://python3porting.com/cextensions.html

使用Swig,我要做的是使用pip輪命名約定: 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會知道它需要使用py2用於python2和py3用於python3。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM