我尝试为pyRFC创建一个独立的轮子:http://sap.github.io/PyRFC/install.html
我有需要的(封闭源代码)库和头文件。
如果我将库和标头复制到$ VIRTUAL_ENV / lib和$ VIRTUAL_ENV / include,则安装pyRFC即可。
现在,我尝试创建一个包含封闭的源库文件的轮子。
但是我失败了。
如果我解压轮子,它只会包含以下内容:
(pypi)pypi@pypiserver:~> unzip -l packages/pyrfc-1.9.91-cp27-cp27mu-linux_x86_64.whl
Archive: packages/pyrfc-1.9.91-cp27-cp27mu-linux_x86_64.whl
Length Date Time Name
--------- ---------- ----- ----
5366 2018-07-23 13:38 pyrfc/_exception.py
1045 2018-07-23 13:38 pyrfc/__init__.py
1610216 2018-07-23 14:10 pyrfc/_pyrfc.so
3835 2018-07-23 14:10 pyrfc-1.9.91.dist-info/DESCRIPTION.rst
990 2018-07-23 14:10 pyrfc-1.9.91.dist-info/metadata.json
6 2018-07-23 14:10 pyrfc-1.9.91.dist-info/top_level.txt
105 2018-07-23 14:10 pyrfc-1.9.91.dist-info/WHEEL
4666 2018-07-23 14:10 pyrfc-1.9.91.dist-info/METADATA
715 2018-07-23 14:10 pyrfc-1.9.91.dist-info/RECORD
--------- -------
1626944 9 files
缺少extra_objects(见下文)。
如何修改pyRFC的setup.py以使转盘包含$ VIRTUAL_ENV / lib中的库?
这是setup.py:https://github.com/SAP/PyRFC/blob/master/setup.py
我为setup.py尝试了此补丁
@@ -48,7 +49,9 @@ PYRFC_EXT = Extension(
, libraries=LIBS
, define_macros=MACROS
, extra_compile_args=COMPILE_ARGS
- , extra_link_args=LINK_ARGS
+ , extra_link_args=LINK_ARGS,
+ library_dirs=['lib'],
+ extra_objects = ['lib/libicudata.so.50', 'lib/libsapnwrfc.so', 'lib/libicui18n.so.50', 'lib/libicuuc.so.50', 'lib/libicudecnumber.so', 'lib/libsapucum.so'],
)
如果我在没有libsapnwrfc.so
的情况下安装和运行该库,则会出现此错误:
Traceback (most recent call last):
File "test-pyrfc.py", line 1, in <module>
from pyrfc import Connection
File "/home/other/lib/python2.7/site-packages/pyrfc/__init__.py", line 22, in <module>
from pyrfc._pyrfc import get_nwrfclib_version, Connection, TypeDescription, FunctionDescription, Server
ImportError: libsapnwrfc.so: cannot open shared object file: No such file or directory
如果我跟踪打开的调用,我会看到它只在库的根目录下查看。该库无法在virtualenv(/ home / other)中进行搜索:
strace python test-pyrfc.py 2>&1 | grep libsapnwrfc.so
open("/lib64/tls/x86_64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/tls/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/x86_64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/x86_64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/x86_64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libsapnwrfc.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "libsapnwrfc.so: cannot open shar"..., 73libsapnwrfc.so: cannot open shared object file: No such file or directory) = 73
我想通过滚轮将“ libsapnwrfc.so”安装到virtualenv中,因为这使我拥有了多个独立环境的能力。我可以通过RPM或config-management安装它,但是我想避免它。
答案 0 :(得分:1)
extra_objects
仅在链接扩展程序lib时使用,并且未捆绑在轮子中。 From the docs:
extra_objects
:要链接的其他文件列表(例如,“源”未隐含的目标文件,必须明确指定的静态库,二进制资源文件等)
要将lib捆绑到wheel中,对于Linux轮子,请使用auditwheel
;对于MacOS轮子,请使用delocate
。 SO已经有了一个很好的问题:How to build and distribute a Python/Cython package that depends on third party libFoo.so,涵盖了同时使用auditwheel
和delocate
的整个车轮修理过程。在这里,我将仅概述必要的命令。这两种工具的过程非常相似:
$ pip install auditwheel # you may also need to install patchelf
$ python setup.py bdist_wheel
$ auditwheel show dist/*_linux_x86_64.whl # will show the libs to be bundled
$ auditwheel repair dist/*_linux_x86_64.whl
这将创建一个新目录dist/wheelhouse
,其中包含带有捆绑的lib的新车轮。