我已经能够在我的 .pyx 脚本上使用 cython 在 linux 上创建一个 .so 文件。我也可以成功地在我的 python 解释器上进行导入。
我的问题是如何在不使用 cython 的情况下将这个 .so 安装在最终用户的机器上?我不想将任何 .pyx 或 .py 或 .c 文件分发给最终用户。而且我不希望最终用户安装 cython 或任何东西来使用我的 .so 文件
我已经能够在我的 .pyx 脚本上使用 cython 在 linux 上创建一个 .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)
$
您可以看到它依赖于安装的许多其他库,并且需要安装 python2.7,但这里的所有内容都安装在默认的 Ubuntu 部署中。请注意,此处不需要安装 Cython。
如果使用相同的处理器架构和相同版本的操作系统,您将能够将 .so 复制到/usr/local/lib/python2.7/dist-packages
目标计算机上,然后您将能够导入它。
当然,如果您import
的 Cython 模块中有任何语句,则需要确保这些模块也存在于目标系统上。
分发 python 轮更容易和最好。你的目标机器上需要 pip3,但 Cython 不需要。
在建筑机器上:
用这种 setup.py 构建你的轮子:
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
您将.whl
在文件夹中获得一个文件dist
。
在目标机器上:
将wheel文件复制到您的目标机器,然后使用以下命令行安装它:
pip3 install myPackage-*-cp34-cp34m-linux_x86_64.whl
(注意你的包是为python版本(cp34)和专用平台(linux_x86_64)构建的,所以你需要和构建机器一样(或者你可以使用manylinux来解决这个问题))。