我已经使用Cython在Linux上成功地将我的.pyx脚本转换为.so文件,并且可以在Python解释器中成功导入它。
我的问题是,如何在不使用Cython的情况下将这个.so文件安装到最终用户的机器上?我不想向最终用户分发任何.pyx、.py或.c文件。同时,我也不希望最终用户安装Cython或其他任何东西来使用我的.so文件。
我已经使用Cython在Linux上成功地将我的.pyx脚本转换为.so文件,并且可以在Python解释器中成功导入它。
我的问题是,如何在不使用Cython的情况下将这个.so文件安装到最终用户的机器上?我不想向最终用户分发任何.pyx、.py或.c文件。同时,我也不希望最终用户安装Cython或其他任何东西来使用我的.so文件。
您可以使用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)
$
/usr/local/lib/python2.7/dist-packages
,然后您将能够导入它,前提是使用相同的处理器架构和操作系统版本。import
语句,则需要确保目标系统上也存在这些模块。分发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
pip3 install myPackage-*-cp34-cp34m-linux_x86_64.whl
请注意,您的软件包是针对Python版本(cp34)和特定平台(linux_x86_64)构建的,因此您需要与构建机器相同(或者您可以使用manylinux来解决这个问题)。