- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在使用 python setup.py bdist_wheel
构建 Cython 模块后,我需要运行某些命令或等效的命令。这可能吗?
具体情况如下:
我正在为 osx 开发 Cython 程序。它链接到某些 .dylib
我的主目录中的文件并要构建程序,您要么必须运行
export DYLD_LIBRARY_PATH=/path/to/parent/dir
setup.py
中包含指令运行
install_name_tool -change @executable_path/my.dylib /path/to/my.dylib
dylib
.这两种选择都不理想,但后者似乎更便携。现在我刚刚将这些说明添加到
setup.py
的底部。 ,但这仍然是不可移植的:假设我打包并上传我的包如下:
python setup.py sdist # I think this collects source files into a .tar
python setup.py bdist_wheel # I think this builds a binary. This is where I assume the post-compilation stuff should happen.
twine upload dist/* # This puts stuff up on PyPi.
pip install mypackage
ImportError: dlopen(/path/to/my/module.cpython-36m-darwin.so, 2):
Library not loaded: @executable_path/my.dylib
Referenced from: /path/to/my/module.cpython-36m-darwin.so
Reason: image not found
install_name_tool
需要进行操作。假设这是可能的,人们将如何做到这一点?理想情况下,我想使用现成的
Cython.Build.cythonize
和
setuptools.Extension
,但也许我需要做一些更定制的事情。感谢您的建议!
install_name_tool
不是一个可移植的解决方案,而是应该以某种方式将 dylib 包含在包中。
delocate
是工作的工具,但我遇到的第一个挑战是
delocate
不适用于
@executable_path
:
❯ delocate-wheel -w fixed_wheels -v dist/*.whl
Fixing: dist/my-package-1.0.9-cp36-cp36m-macosx_10_12_x86_64.whl
/Users/ethan/virtualenvs/my-package/lib/python3.6/site-packages/delocate/delocating.py:71: UserWarning: Not processing required path @executable_path/my.dylib because it begins with @
'begins with @'.format(required))
otool
,我能够验证
id
的
my.dylib
使用
@executable_path
:
❯ otool -L my.dylib
my.dylib:
@executable_path/my.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1258.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
@executable_path
我运行了以下内容:
❯ install_name_tool -id my.dylib my.dylib
otool -L
的输出:
❯ otool -L my.dylib
my.dylib:
my.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.1.0)
/System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1258.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
id
用于 dylib,但对于
delocate-wheel
来说已经足够了跟...共事。我重建了我的
.whl
:
python setup.py bdist_wheel
delocate_wheel
:
❯ delocate-wheel -w fixed_wheels -v dist/*.whl
Fixing: dist/my.whl
Traceback (most recent call last):
...
delocate.delocating.DelocationError: library "/Users/ethan/my-package/my.dylib" does not exist
delocate
期望找到
my.dylib
.所以我复制了
my.dylib
至
/Users/ethan/my-package/my.dylib
并重新运行命令:
❯ delocate-wheel -w fixed_wheels -v dist/*.whl
Fixing: dist/my.whl
Copied to package .dylibs directory:
/Users/ethan/my-package/my.dylib
.dylibs
目录?我跑了
tar -xvf my.whl
打开车轮包装并检查其内容:
❯ tree -a fixed_wheels/my-package
fixed_wheels/my-package
├── .dylibs
│ └── my.dylib
├── __init__.py
└── package.cpython-36m-darwin.so
my.dylib
已复制到
.dylibs/
打包在
my.whl
中的目录.上传后
my.whl
对于 pypi,我能够很好地下载和运行代码。
最佳答案
看看delocate和 Linux 等效的 auditwheel .
delocate 工具无需在运行时更改链接加载器路径,而是将第三方库嵌入到轮子中并相应地调整加载时间路径。
结果是一个可分发的二进制轮子,其中包含正确的所有依赖库。
设置运行时加载路径是不可移植的,并且不能跨 python 版本或机器架构工作。
例如对于上面的例子,在 python setup.py bdist_wheel
创建了一个轮子之后跑:delocate-wheel -w fixed_wheels <wheel file>
固定轮文件将放在 fixed_wheels
下目录。运行 -v
查看它嵌入了哪些库。
关于cython - 分发 python 包时处理 dylibs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47380150/
我认为我弄乱了 libxml2.dylib、libz.dylib、libicucore.dylib 和 libc++.dylib 文件,然后 1. 在项目中显示为红色,2. 导致链接器错误。 并在与库
我正在研究 SDK,试图了解实际包含的内容。 我注意到 dylibs 有时会以多个版本发布,例如 ls /Applications/Xcode.app/Contents/Developer/Platf
我在评论中提出了这个问题,但这似乎是一个值得单独提问的问题。 我有一个项目在三个不同的 XCode 安装和两个不同的 iOS SDK 安装之间共享。目前,统一所涉及的开发人员不是一种选择。 当我安装
我正在多次加载 dylib 并尝试理解是什么让这些符号不同。 这是我的步骤: 使用以下入口点构建 lib_a.dylib: FactoryA : IFActory () {} extern "C" I
我正在关注 this tutorial 教程说明要添加 libz.1.2.3.dylib. 库,但是因为我下载了新的或旧的库(我不知道我的库是新的还是旧的教程中的库,但 99% 是较新的)。所以,当我
有没有办法使用 dylib 的路径查找其版本?我正在寻找接受与 dlopen 相同参数的东西。我查看了 NSVersionOfRunTimeLibrary,但从我阅读的文档来看,它似乎获取了当前 dy
我正在从源代码构建 cyrus sasl2 库。库安装在/usr/local/lib 中, header 安装在/usr/local/include/sasl 中,这是正确的。 但是,当我运行尝试使用
我确定 .A 意味着什么,但搜索它只会产生噪音。请赐教。 最佳答案 哦,它们是一样的。 -rwxr-xr-x 1 root wheel 4969408 Sep 25 16:06 libicuco
我已经从我的 iOS 应用项目构建了一个 ipa 包。使用 zip 打开 .ipa 文件后。我发现这里有很多 swift 支持的动态库。 我想知道 libswiftFoundation.dylib 和
在带有 gcc-5.2 的 g++ 的 mac os x 下,我正在尝试执行以下操作:创建一个 dylib,导出由 header tmp8bis_dylib.h 定义的类和来源 tmp8bis_dyl
我正在使用 py2app 从 Python 代码创建一个应用程序。 一切顺利,直到我运行 setup.py,然后在它运行的最后我收到这条消息:“ValueError: '/Users/(my_comp
我有一个旧的 iOS Xcode 项目,我在其中使用了 libxml2.dylib 和 libresolv.9.dylib。安装 XCode7 后。 我找不到文件,也不知道去哪里搜索。有人可以帮助我吗
我开始在我正在开发的应用程序中使用 SQLite 数据库。我还没有遇到问题,但是来自 this tutorial 的早期步骤之一正在链接 SQLite3 框架。本教程需要 libsqlite3.0.d
我正在为 Xamarin.Mac 创建绑定(bind)/MonoMac 。我想嵌入 dylib在生成的dll中就像 Xamarin.iOS 上所做的那样与 [LinkWith]属性。 可以这样做吗?如
C++ dylib 暴露如下 __attribute__((visibility("default"))) int addNumber(int number) { return 0; } 在我
目前我正在使用 libxml2.dylib 来解析 XML 现在我想转移到 libxml2.2.dylib。那么,我会在配置和编码方面做什么样的改变? 最佳答案 Xcode 4.5(和重要的 iOS6
在使用 matplotlib 时获取错误信息: Error #15: Initializing libiomp5.dylib, but found libiomp5.dylib already ini
我已经创建了一个Python应用程序,并使用Pyinstaller将其构建到Unix可执行文件中。在我尝试对应用程序进行代码签名之前,应用程序运行得很好。在代码签名之后,我在尝试运行可执行文件时收到以
我正在尝试在应用程序上使用 Parse,我是 swift 的新手。但是我下载了 Xcode 7,似乎 libz.dylib libsqlite3.dylib 丢失了,当我编译和构建它时,它已成功完成,
我在尝试在任何脚本上使用 Pilow 时遇到此错误: File "/Users/antonio/WWW/myproj/myproj/functions.py", line 12, in
我是一名优秀的程序员,十分优秀!