我对这一切都不熟悉,所以请原谅我在这里做了些蠢事。把我当成一个彻头彻尾的傻瓜来对待并向我解释会很有帮助。你知道吗
我有一个用python编写的简单函数,文件名a.pyx
:-
#!/usr/bin/env python
import os
import sys
def get_syspath():
ret = sys.path
print "Syspath:{}".format(ret)
return ret
我希望它能够被tcl使用。你知道吗
我看完了赛顿的那一页,跟着他走。你知道吗
我跑了本文件:你知道吗
cython -o a.c a.pyx
然后我运行这个命令来生成对象文件a.o
:-
gcc -fpic -c a.c -I/usr/local/include -I/tools/share/python/2.7.1/linux64/include/python2.7
然后运行这个来生成so文件a.so
:-
gcc -shared a.o -o a.so
当我从tclsh加载它时,它失败了。你知道吗
$tclsh
% load ./a.so
couldn't load file "./a.so": ./a.so: undefined symbol: PyExc_RuntimeError
我走的路对吗?如果没有,请向我解释一下哪里出了问题,我应该怎么做?你知道吗
提前谢谢。你知道吗
也许可以看看^{} 或^{} 。你知道吗
两者都允许从Tcl调用Python代码。你知道吗
但是如果你想用一种更好的方式包装东西,比如说已经包装好了更好的api,也许你也应该看看Elmer,它似乎是针对你尝试的任务。你知道吗
在构建可加载库时,需要将目标代码链接到它所依赖的库。这意味着添加适当的
-l...
选项,也可能添加一些-L...
选项。我猜这个选项应该是-lpython27
或者类似的东西(链接到库搜索路径的某个地方;库搜索路径是用-L...
选项修改的),但是我不知道。路径在很大程度上取决于你的系统是如何设置的,你的另一半可能需要实验。你知道吗在Tcl中,它仍然可能无法作为可加载库工作。Tcl希望有一个库初始化函数(在您的例子中,它将查找
A_Init
),该函数将Tcl_Interp*
作为它的唯一参数,以便库可以将它定义的命令安装到Tcl解释器上下文中。如果Python在默认情况下做出这样的事情,我会感到惊讶。这对你来说还没有失败,因为失败仍然发生在内部的dlopen()
调用中,而不是dlsym()
调用中,但我可以自信地预测你仍然会面对它们。你知道吗“集成”这类功能的最简单方法是在子流程中运行命令。你知道吗
下面是您可能使用的Python代码:
下面是使用它的Tcl代码:
这不是最有效的方法,但它非常容易使它工作,因为你不必解决编译和链接的两种语言。这是一个高效的程序员
相关问题 更多 >
编程相关推荐