Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何构建和分发依赖于第三方libFoo.so的Python/Cython包_Python_Setuptools_Python Extensions_Python Packaging - Fatal编程技术网

如何构建和分发依赖于第三方libFoo.so的Python/Cython包

如何构建和分发依赖于第三方libFoo.so的Python/Cython包,python,setuptools,python-extensions,python-packaging,Python,Setuptools,Python Extensions,Python Packaging,我已经编写了一个依赖于一些C扩展的Python模块。这些C扩展反过来又依赖于几个已编译的C库。我希望能够将此模块与所有依赖项捆绑在一起分发 我总结了一个简单的例子() 目录结构为: $ tree . . ├── README.md ├── poc │   ├── __init__.py │   ├── cython_extensions │   │   ├── __init__.py │   │   ├── cvRoberts_dns.c │   │   ├── cvRoberts_dns.h

我已经编写了一个依赖于一些C扩展的Python模块。这些C扩展反过来又依赖于几个已编译的C库。我希望能够将此模块与所有依赖项捆绑在一起分发

我总结了一个简单的例子()

目录结构为:

$ tree .
.
├── README.md
├── poc
│   ├── __init__.py
│   ├── cython_extensions
│   │   ├── __init__.py
│   │   ├── cvRoberts_dns.c
│   │   ├── cvRoberts_dns.h
│   │   ├── helloworld.c
│   │   ├── helloworld.pxd
│   │   ├── helloworld.pyx
│   │   ├── test.c
│   │   └── test.h
│   ├── do_stuff.c
│   └── do_stuff.pyx
└── setup.py
setup.py针对必要的库构建扩展和链接(
libsundals\u cvode
libsundals\u invectorserial
):

这一切都很好,但它确实需要最终用户首先安装Sundals(在实际情况中,还需要安装其他几个非常挑剔的库)

理想情况下,我希望能够仅在开发机器上进行设置,创建包含适当共享库的发行版,并提供某种捆绑包

给出了到目前为止我找到的各种教程、示例和帖子。我被引导去相信我在正确的轨道上。然而,还有一些最后的步骤,我只是没有摸索


非常感谢您的帮助:-)。

您可能知道,分发包含已编译组件的Python模块的推荐方法是使用。似乎没有任何标准的跨平台方式将第三方本机库捆绑到轮子中。但是,有一些特定于平台的工具可用于此目的

在Linux上,使用
auditwheel
。 修改现有Linux控制盘文件以添加基本“”标准中未包含的任何第三方库。下面是一个演练,介绍如何在Ubuntu 17.10的干净安装中将其用于您的项目:

首先,安装基本Python开发工具和第三方库及其标题:

root@ubuntu-17:~#apt get install cython python pip解压
root@ubuntu-17:~#apt get安装libsundials串行开发
然后将项目构建到控制盘文件中:

$ delocate-listdeps --all dist/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl
/usr/lib/libSystem.B.dylib
/usr/local/Cellar/sundials/2.7.0_3/lib/libsundials_cvodes.2.9.0.dylib
/usr/local/Cellar/sundials/2.7.0_3/lib/libsundials_nvecserial.2.7.0.dylib
$ delocate-wheel -v -w dist_fixed dist/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl 
Fixing: dist/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl
Copied to package .dylibs directory:
  /usr/local/Cellar/sundials/2.7.0_3/lib/libsundials_cvodes.2.9.0.dylib
  /usr/local/Cellar/sundials/2.7.0_3/lib/libsundials_nvecserial.2.7.0.dylib
root@ubuntu-17:~#cd cython示例/
root@ubuntu-17:~/cython示例#python setup.py bdist_wheel
[...]
root@ubuntu-17:~/cython示例#cd dist/
root@ubuntu-17:~/cython示例/dist#ll
总数80
drwxr-xr-x 2根根目录4096 11月8日11:28/
drwxr-xr-x 7根根目录4096 11月8日11:28/
-rw-r--r--1根根根70135 11月8日11:28 poc-0.0.0-cp27-cp27mu-linux\u x86\u 64.whl
root@ubuntu-17:~/cython示例/dist#解压-l poc-0.0.0-cp27-cp27mu-linux_x86_64.whl
存档:poc-0.0.0-cp27-cp27mu-linux_x86_64.whl
长度日期时间名称
---------  ---------- -----   ----
62440 2017-11-08 11:28 poc/do_stuff.so
2 2017-11-08 11:28 poc/初始
116648 2017-11-08 11:28 poc/cython_extensions/helloworld.so
2 2017-11-08 11:28 poc/cython\u扩展插件
10 2017-11-08 11:28 poc-0.0.0.dist-info/DESCRIPTION.rst
211 2017-11-08 11:28 poc-0.0.0.dist-info/metadata.json
4 2017-11-08 11:28 poc-0.0.0.dist-info/top_level.txt
105 2017-11-08 11:28 poc-0.0.0.dist-info/WHEEL
167 2017-11-08 11:28 poc-0.0.0.dist-info/METADATA
793 2017-11-08 11:28 poc-0.0.0.dist-info/RECORD
---------                     -------
180382 10个文件
现在可以在本地安装和测试控制盘文件:

root@ubuntu-17:~/cython示例/dist#pip安装poc-0.0.0-cp27-cp27mu-linux_x86_64.whl
[...]
root@ubuntu-17:~/cython示例/dist#python-c“来自poc.do#u stuff import hello;hello()”
你好,赛顿
0.841470984808
正在尝试加载日晷程序
三组分动力学问题
t=2.6391e-01 y=9.899653e-01 3.470564e-05 1.000000e-02时
rootsfound[]=0 1
t=4.0000e-01 y=9.851641e-01 3.386242e-05 1.480205e-02时
[...]
现在我们安装
auditwheel
工具。它需要Python3,但它能够处理Python2或Python3的控制盘

root@ubuntu-17:~/cython示例/dist#apt get安装python3 pip
root@ubuntu-17:~/cython示例/dist#pip3安装审计轮
auditwheel
使用另一个名为
patchelf
的工具来完成其工作。不幸的是,Ubuntu17.10附带的
patchelf
版本缺失,没有它。因此,我们必须从源代码(脚本取自):

root@ubuntu-17:~#apt get install autoconf
root@ubuntu-17:#PATCHELF#u VERSION=6bfcafbba8d89e44f9ac9582493b4f27d9d8c369
root@ubuntu-17:~#curl-sL-o patchelf.tar.gzhttps://github.com/NixOS/patchelf/archive/$PATCHELF_VERSION.tar.gz
root@ubuntu-17:~#tar-xzf patchelf.tar.gz
root@ubuntu-17:~#(cd patchelf-$patchelf#U版本&&&&./bootstrap.sh&&&&&&&&&&&&&&&&&&&&&&&&&&&
现在,我们可以检查控制盘需要哪些第三方库:

root@ubuntu-17:~/cython示例/dist#auditwheel show poc-0.0.0-cp27-cp27mu-linux_x86_64.whl
poc-0.0.0-cp27-cp27mu-linux_x86_64.whl与
以下平台标签:“linux_x86_64”。
控制盘参照这些系统中的外部版本符号-
提供了共享库:libc.so.6,版本为{'GLIBC_2.4',
‘GLIBC_2.2.5’、‘GLIBC_2.3.4’}
控制盘需要以下外部共享库:
{
“libblas.so.3”:“/usr/lib/x86_64-linux-gnu/blas/libblas.so.3.7.1”,
“libc.so.6”:“/lib/x86_64-linux-gnu/libc-2.26.so”,
“libgcc_.so.1”:“/lib/x86_64-linux-gnu/libgcc_.so.1”,
“libgfortran.so.4”:“/usr/lib/x86_64-linux-gnu/libgfortran.so.4.0.0”,
“liblapack.so.3”:“/usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.7.1”,
“libm.so.6”:“/lib/x86_64-linux-gnu/libm-2.26.so”,
“libpthread.so.0”:“/lib/x86_64-linux-gnu/libpthread-2.26.so”,
“libquadmath.so.0”:“/usr/lib/x86_64-linux-gnu/libquadmath.so.0.0”,
“libsundails_cvodes.so.2”:“/usr/lib/libsundails_cvodes.so.2.0.0”,
“libsundails\u nvecserial.so.0”:“/usr/lib/libsundails\u nvecserial.so.0.2”
}
为了实现标记平台标记“manylinux1_x86_64”
下列共享库依赖项
$ python setup.py bdist_wheel
$ delocate-listdeps --all dist/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl
/usr/lib/libSystem.B.dylib
/usr/local/Cellar/sundials/2.7.0_3/lib/libsundials_cvodes.2.9.0.dylib
/usr/local/Cellar/sundials/2.7.0_3/lib/libsundials_nvecserial.2.7.0.dylib
$ delocate-wheel -v -w dist_fixed dist/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl 
Fixing: dist/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl
Copied to package .dylibs directory:
  /usr/local/Cellar/sundials/2.7.0_3/lib/libsundials_cvodes.2.9.0.dylib
  /usr/local/Cellar/sundials/2.7.0_3/lib/libsundials_nvecserial.2.7.0.dylib
$ ls -l dist/ dist_fixed/
dist/:
total 72
-rw-r--r--  1 hoefling  wheel  36030 10 Nov 20:25 poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl

dist_fixed/:
total 240
-rw-r--r--  1 hoefling  wheel  120101 10 Nov 20:34 poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl
$ delocate-listdeps --all dist_fixed/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl 
/usr/lib/libSystem.B.dylib
@loader_path/../.dylibs/libsundials_cvodes.2.9.0.dylib
@loader_path/../.dylibs/libsundials_nvecserial.2.7.0.dylib
$ pip install dist_fixed/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl 
Processing ./dist_fixed/poc-0.0.0-cp27-cp27m-macosx_10_13_intel.whl
Installing collected packages: poc
Successfully installed poc-0.0.0
$ pip show -f poc
Name: poc
Version: 0.0.0
Summary: UNKNOWN
Home-page: UNKNOWN
Author: UNKNOWN
Author-email: UNKNOWN
License: UNKNOWN
Location: /Users/hoefling/.virtualenvs/stackoverflow-py27/lib/python2.7/site-packages
Requires: 
Files:
  poc-0.0.0.dist-info/DESCRIPTION.rst
  poc-0.0.0.dist-info/INSTALLER
  poc-0.0.0.dist-info/METADATA
  poc-0.0.0.dist-info/RECORD
  poc-0.0.0.dist-info/WHEEL
  poc-0.0.0.dist-info/metadata.json
  poc-0.0.0.dist-info/top_level.txt
  poc/.dylibs/libsundials_cvodes.2.9.0.dylib
  poc/.dylibs/libsundials_nvecserial.2.7.0.dylib
  poc/__init__.py
  poc/__init__.pyc
  poc/cython_extensions/__init__.py
  poc/cython_extensions/__init__.pyc
  poc/cython_extensions/helloworld.so
  poc/do_stuff.so