如何分发从cython生成的.so文件

问题描述:

我已经能够在我的.pyx脚本上使用cython在linux上创建一个.so文件。我也可以成功地在我的Python解释器上进行导入。如何分发从cython生成的.so文件

我的问题是如何在不使用cython的情况下在最终用户的机器上安装.so。我不想将任何.pyx或.py或.c文件分发给最终用户。而且我也不希望最终用户安装cython或其他任何东西来使用我的.so文件

+1

我想你必须确保最终用户至少有相同的处理器架构。我不确定不同python版本之间的内部兼容性,尽管...为什么不向用户提供一个.c文件? – dmytro 2013-02-13 02:03:10

+0

我不想给他们来源。 :) – user2005803 2013-02-13 02:33:06

+1

然后它是一个死的手:你将不得不为所有目标平台编译自己... – 2013-02-17 13:51:49

您可以使用ldd来检查.so的静态依赖关系。这里有一个.so我用Cython建我的Ubuntu桌面上的依存关系:

$ ldd iksolver.so 
linux-vdso.so.1 => (0x00007fffc07fe000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdcabc08000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdcab903000) 
libpython2.7.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (0x00007fdcab3d3000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdcab00b000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fdcac068000) 
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fdcaadf4000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fdcaabef000) 
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007fdcaa9ec000) 
$ 

你可以看到,这取决于安装了很多其他库,而且它需要安装python2.7,但这里的一切安装在默认的Ubuntu部署中。请注意,这里没有任何要求安装Cython。

如果使用相同的处理器架构和相同版本的操作系统,您将能够将.so复制到目标机器上的/usr/local/lib/python2.7/dist-packages,然后您就可以导入它。

当然,如果您的Cython模块中有任何import语句,您需要确保这些模块也存在于目标系统上。