如何分发使用Cython生成的.so文件

4

我已经使用Cython在Linux上成功地将我的.pyx脚本转换为.so文件,并且可以在Python解释器中成功导入它。

我的问题是,如何在不使用Cython的情况下将这个.so文件安装到最终用户的机器上?我不想向最终用户分发任何.pyx、.py或.c文件。同时,我也不希望最终用户安装Cython或其他任何东西来使用我的.so文件。


1
我猜你需要确保最终用户至少有相同的处理器架构。但是我不确定不同Python版本之间的互操作性...为什么不提供用户一个单独的.c文件呢? - dmytro
我不想给他们源代码。 :) - user2005803
1
那么这就是一个死结了:你必须为所有目标平台自己编译... - Gauthier Boaglio
2个回答

3

您可以使用ldd命令来检查您的.so文件的静态依赖关系。以下是我在Ubuntu桌面上使用cython构建的.so文件的依赖关系:

$ 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语句,则需要确保目标系统上也存在这些模块。

但是我已经读到直接将文件复制到目录不是一个好的做法。我们如何使用setup/distutils和/或pip来完成这个操作?我没有在任何地方看到过这样的例子。谢谢。D. - doom

2

分发Python wheel更加简单和便捷。在目标机器上需要安装pip3,但不需要安装Cython。

在构建机器上:

使用以下setup.py文件构建你的wheel:

from Cython.Build import cythonize
from setuptools import setup, Extension

setup(  name='myPackage',
        version='1.0',
        py_modules=['myPackage'],
        ext_modules =
            cythonize(Extension("myPackageExtension",
                        # the extension name
                sources=["myPackageExtension.pyx", "Tool1.cpp", "Tool2.cpp"],
                        # the Cython source and additional C++ source files
                language="c++", # generate and compile C++ code
                                )
                        )
    )

以下是要执行的命令行:

python3 setup.py bdist_wheel

你将在“dist”文件夹中获得一个“.whl”文件。
在目标计算机上:
将wheel文件复制到目标计算机上,然后使用以下命令行进行安装:
pip3 install myPackage-*-cp34-cp34m-linux_x86_64.whl

请注意,您的软件包是针对Python版本(cp34)和特定平台(linux_x86_64)构建的,因此您需要与构建机器相同(或者您可以使用manylinux来解决这个问题)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接