尝试在tcl中支持python代码

尝试在tcl中支持python代码,python,tcl,cython,swig,Python,Tcl,Cython,Swig,我对这一切都不熟悉,所以如果我在这里做了一些蠢事,请原谅。对待我,向我解释,好像我是一个彻头彻尾的傻瓜,这会很有帮助 我有一个用python编写的简单函数,filenamea.pyx:- #!/usr/bin/env python import os import sys def get_syspath(): ret = sys.path print "Syspath:{}".format(ret) return ret 我希望它能够被tcl使用 我通读了赛昂的网页

我对这一切都不熟悉,所以如果我在这里做了一些蠢事,请原谅。对待我,向我解释,好像我是一个彻头彻尾的傻瓜,这会很有帮助

我有一个用python编写的简单函数,filename
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 
gcc -shared a.o -o a.so
然后运行此命令生成so文件
a.so
:-

gcc -fpic -c a.c -I/usr/local/include -I/tools/share/python/2.7.1/linux64/include/python2.7 
gcc -shared a.o -o a.so
当我从tclsh加载它时,它失败了

$tclsh
% load ./a.so
couldn't load file "./a.so": ./a.so: undefined symbol: PyExc_RuntimeError
我走的路对吗?如果没有,请向我解释什么地方出了问题,我应该怎么做


提前感谢。

在构建可加载库时,需要将目标代码链接到它所依赖的库。这意味着添加适当的
-l..
选项,并可能添加一些
-l..
选项。我猜这个选项可能类似于
-lpython27
或类似的东西(链接到
libpython27.so
库搜索路径上的某个地方;库搜索路径用
-L..
选项修改),但我不知道。路径将在很大程度上取决于您的系统是如何设置的,您的另一半可能需要进行实验

在Tcl中,它仍然可能无法作为可加载库工作。Tcl希望有一个库初始化函数(在您的例子中,它将查找
a_Init
),该函数将
Tcl_Interp*
作为其唯一参数,以便库可以将它定义的命令安装到Tcl解释器上下文中。如果Python在默认情况下做出这样的事情,我会感到惊讶。这对您来说还没有失败,因为失败仍然发生在内部
dlopen()
调用期间,而不是
dlsym()
调用期间,但我可以自信地预测,您仍然会面对它们

“集成”此类功能的最简单方法是在子流程中运行命令

以下是您可能使用的Python代码:

导入操作系统
导入系统
打印系统路径
下面是使用它的Tcl代码:

set syspath[exec python/path/to/yourcode.py]
#如果它与此脚本位于同一目录中,请使用以下命令:
#设置syspath[exec python[file join[file dirname[info script]]yourcode.py]]
这不是最有效的方法,但它非常容易实现,因为您不必解决两种语言的编译和链接问题。它的编程效率很高…

也许可以看看或

两者都允许从Tcl调用Python代码


但是,如果您想以更好的方式包装东西,例如,有更好的已经包装好的API,也许您还应该看看,它似乎针对您尝试的任务。

hi@donal thx寻求帮助。但我真正需要做的不止这些。我有一个包含对象类的包。我需要将所有这些转换成tcl可用的包。关于我应该寻找什么或在哪里,有什么提示吗?