如果您重命名quacker.pyx
to quacker.py
,实际上一切都是正确的。唯一的问题是你的程序不会在当前目录中搜索 python 模块,从而导致输出:
Exception NameError: "name 'quack' is not defined" in 'caller.call_quack' ignored
但是,如果将当前目录添加到 PYTHONPATH 环境变量中,输出将成为您期望的输出:
$ PYTHONPATH=".:$PYTHONPATH" ./main
Quack!
运行python shell时,根据文档 http://docs.python.org/2/tutorial/modules.html#the-module-search-path当前目录(或包含脚本的目录)被添加到sys.path
自动变量,但是当使用创建一个简单的程序时Py_Initialize
and Py_Finalize
这似乎不会发生。由于 PYTHONPATH 变量也用于填充sys.path
python 变量,上面的解决方法会产生正确的结果。
或者,在下面Py_Intialize
行,您可以添加一个空字符串到sys.path
如下所示,只需执行一些指定为字符串的 python 代码:
PyRun_SimpleString("import sys\nsys.path.insert(0,'')");
重新编译后,运行即可./main
然后应该可以工作。
Edit
如果您按照问题中指定的方式运行代码,那么看看会发生什么实际上很有趣,因此无需重命名quacker.pyx
文件。在这种情况下,initcaller()
函数尝试导入quacker
模块,但由于没有quacker.py
or quacker.pyc
存在,找不到该模块,并且initcaller()
函数产生错误。
现在,通过引发异常,以 python 方式报告此错误。但代码中的main.c
文件不检查这一点。我不是这方面的专家,但在我的测试中添加了以下代码initcaller()
似乎有效:
if (PyErr_Occurred())
{
PyErr_Print();
return -1;
}
程序的输出结果如下:
Traceback (most recent call last):
File "caller.pyx", line 1, in init caller (caller.c:836)
from quacker import quack
ImportError: No module named quacker
通过致电initquacker()
功能before initcaller()
, 模块名称quacker
已经注册了,所以导入调用是在里面完成的initcaller()
将检测到它已经加载并且调用将成功。