gpt4 book ai didi

python - 创建独立的轮子

转载 作者:行者123 更新时间:2023-12-01 09:13:10 28 4
gpt4 key购买 nike

我尝试为 pyRFC 创建一个独立的轮子:http://sap.github.io/PyRFC/install.html

我有所需的(闭源)库和头文件。

如果我将库和 header 复制到 $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

我想通过wheel将“libsapnwrfc.so”安装到virtualenv中,因为这使我能够拥有多个独立的环境。我可以通过 RPM 或配置管理安装它,但我想避免它。

最佳答案

extra_objects 仅在链接扩展库时使用,并且不捆绑在轮子中。 From the docs :

extra_objects: list of extra files to link with (eg. object files not implied by ‘sources’, static library that must be explicitly specified, binary resource files, etc.)

要将库捆绑到wheel中,请使用auditwheel(对于Linuxwheel)或delocate(对于MacOSwheel)。 SO已经有一个很好的问题:How to build and distribute a Python/Cython package that depends on third party libFoo.so其中涵盖了使用 auditwheeldelocate 的整个车轮修复过程。这里我只总结一下必要的命令。这两个工具的过程非常相似:

$ 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,其中包含带有捆绑库的新车轮。

关于python - 创建独立的轮子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51481018/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com