来自C源代码的python3.6.2(Spyder环境)模块

时间:2019-01-06 00:11:24

标签: c python-3.x swig spyder

我是python的新手,我一直在用spyder编写脚本并在python3.6.2的Ipython控制台中运行它们,因此我经常使用它。

我正在尝试通过几个swig教程(http://www.swig.org/tutorial.htmlhttp://www.swig.org/Doc1.3/Python.html#Python_nn6)从“ swig_example.c”文件中编写一个简单的模块。

我的目标是能够运行一个如下所示的脚本“ main_python.py”:

import swig_test

print(swig_test.fact(4))

fact是原始c源中定义的函数。

源文件是“ swig_example.c”:

/* File: swig_example.c */
#include "swig_example.h"

int fact(int n) {
 if (n == 0) {
     return 1;
 }
 else {
     return n * fact(n-1);
 }
}

头文件很简单:

/* File: swig_example.h */

int fact(int n);

和界面一:

/* File: swig_example.i */
%module swig_test

%{
#include "swig_example.h"
%}

%include "swig_example.h"

在终端中运行时:

swig -python swig_example.i

创建一个“ swig_example_wrap.c”和一个“ swig_test.py”文件。

我应该如何继续运行“ main_python.py”? (现在返回“没有名为'_swig_test'的模块”错误)。 我想要一些脚本(也许正在使用distutils?),以便每次修改.c源代码时,都可以轻松更新模块,而无需更改“ main_python.py”文件。 如果您有使用Xcode而不是spyder的解决方案,那将是可以接受的。

我认为这个问题可能对许多python新手(实际上是Mac ...)有用,并尝试使用它,同时又不要丢掉以前的作品...

编辑: 我部分解决了这个问题。现在重点仍然是Spyder。 我按照我描述的方式创建文件“ .c”,“。h”和“ .i”。然后,按照该帖子(Python.h not found using swig and Anaconda Python),在同一文件夹中创建我的“ setup.py”文件:

from distutils.core import setup, Extension


example_module = Extension('_example', sources=['example.c','example.i'])

setup(name='example', ext_modules=[example_module], py_modules= .["example"])

然后,在anaconda导航器中,打开我正在工作的环境的终端,移至正确的文件夹并运行:

python setup.py build_ext --inplace

如果现在我打开spyder,则一切正常。但是,如果现在我想修改我的C源代码,比如说添加一个新函数,则会出现问题。我修改了“ .c”,“。h”和“ .i”文件,然后在终端的前一行重新运行。正确修改了“ example.py”文件的结果(它不包含新函数的属性),但是当尝试在spyder中导入模块(导入示例)时,未注册更改,并且错误消息“ _example没有属性”除非我重新启动Spyder本身,否则Ipython控制台会提供新功能。

是否有更快的方法来修复它? (也许这是评论中提到的互动……)

谢谢大家:-)

0 个答案:

没有答案