如何使用autotools与库同时构建Python接口

Mal*_*ous 5 c++ python autoconf swig autotools

我目前有一个用C++编写的库,用GNU autotools构建,我想为它添加一个Python接口.使用SWIG我已经开发了接口,但是我在弄清楚如何将Python模块的编译与其余过程集成时遇到了一些麻烦.

我已经研究过AM_PATH_PYTHON,但是这个宏似乎没有设置Python.h的包含路径,所以当我编译我的模块时,我得到一堆关于缺少包含文件的错误.有没有办法从AM_PATH_PYTHON中获取Python包含路径和ldflags?

仅仅为了记录,我认为不可能使用Python的distutils方法(setup.py),因为这需要库的位置以链接新模块.由于库尚未在编译时安装,我将不得不使用相对路径(例如../src/lib.so),当安装Python模块时当然会破坏(因为库在/改为使用usr/lib或/ usr/local/lib.)

编辑:

现在它可以找到它正在编译的.h文件,但是在安装它之后(在正确的位置)Python无法加载模块.代码生成foo.so,当我"导入foo"时,我得到了这个:

ImportError: dynamic module does not define init function (initfoo)

但是,如果我将它从foo.so重命名为_foo.so然后它加载并运行正常,除了我必须"导入_foo",我宁愿不必这样做.当我按照SWIG指令在当前目录"import foo"中生成_foo.so时,所以我不确定为什么它在站点目录中安装库时会中断.

EDIT2:

原来问题是我忘了将SWIG生成的foo.py复制到_foo.so旁边的安装目录中.一旦我这样做,一切都按预期工作!现在我只需要弄清楚一些将文件复制到安装目录的automake规则......

Jac*_*lly 6

要查找包含路径,我会使用python-config.诀窍是使用python-config对应的python安装在$PYTHON.

AM_PATH_PYTHON
AC_ARG_VAR([PYTHON_INCLUDE], [Include flags for python, bypassing python-config])
AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config])
AS_IF([test -z "$PYTHON_INCLUDE"], [
  AS_IF([test -z "$PYTHON_CONFIG"], [
    AC_PATH_PROGS([PYTHON_CONFIG],
                  [python$PYTHON_VERSION-config python-config],
                  [no],
                  [`dirname $PYTHON`])
    AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON.])])
  ])
  AC_MSG_CHECKING([python include flags])
  PYTHON_INCLUDE=`$PYTHON_CONFIG --includes`
  AC_MSG_RESULT([$PYTHON_INCLUDE])
])
Run Code Online (Sandbox Code Playgroud)

另一个选择是在distutils.sysconfig模块中徘徊(这与使用distutils构建代码无关).跑python -c "import distutils.sysconfig; help(distutils.sysconfig)",看看.