我是python的新手,我一直在用spyder编写脚本并在python3.6.2的Ipython控制台中运行它们,因此我经常使用它。
我正在尝试通过几个swig教程(http://www.swig.org/tutorial.html,http://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控制台会提供新功能。
是否有更快的方法来修复它? (也许这是评论中提到的互动……)
谢谢大家:-)