尝试在中支持python代码

2024-04-18 05:29:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我对这一切都不熟悉,所以请原谅我在这里做了些蠢事。把我当成一个彻头彻尾的傻瓜来对待并向我解释会很有帮助。你知道吗

我有一个用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

我走的路对吗?如果没有,请向我解释一下哪里出了问题,我应该怎么做?你知道吗

提前谢谢。你知道吗


Tags: 文件函数importsoinclude文件名usrsys
2条回答

也许可以看看^{}^{}。你知道吗

两者都允许从Tcl调用Python代码。你知道吗

但是如果你想用一种更好的方式包装东西,比如说已经包装好了更好的api,也许你也应该看看Elmer,它似乎是针对你尝试的任务。你知道吗

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

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

“集成”这类功能的最简单方法是在子流程中运行命令。你知道吗

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

import os
import sys

print sys.path

下面是使用它的Tcl代码:

set syspath [exec python /path/to/yourcode.py]
# If it is in the same directory as this script, use this:
#set syspath [exec python [file join [file dirname [info script]] yourcode.py]]

这不是最有效的方法,但它非常容易使它工作,因为你不必解决编译和链接的两种语言。这是一个高效的程序员

相关问题 更多 >