无法冻结(使用 PyInstaller)python 源代码,包括 Solaris 中的多处理模块
Trouble freezing (with PyInstaller) python source including multiprocessing module in Solaris
我正在尝试冻结并在我的 Solaris11 机器之间分发以下 python 使用多处理模块的代码:
import multiprocessing
def f(name):
print 'hello', name
if __name__ == '__main__':
p = multiprocessing.Process(target=f, args=('fer',))
p.start()
p.join()
但是,即使可执行文件在编译器机器 (Solaris11) 下工作正常...
[root@zgv-wodbuild01 pyinstaller]# testfer/dist/testfer
hello fer
[root@zgv-wodbuild01 pyinstaller]# echo $?
0
...抱怨任何其他机器 (Solaris11) 中的多处理库:
root@dest01a # ./testfer.r004
Traceback (most recent call last):
File "testfer.py", line 1, in <module>
File "/root/pyinstaller/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
File "multiprocessing/__init__.py", line 84, in <module>
File "/root/pyinstaller/PyInstaller/loader/pyimod03_importers.py", line 546, in load_module
ImportError: ld.so.1: testfer.r004: fatal: relocation error: file /tmp/_MEIlBa4uh/_multiprocessing.so: symbol __xnet_sendmsg: referenced symbol not found
Failed to execute script testfer
root@dest01a # echo $?
255
PyInstaller 命令已使用 --onefile
标志启动,因此每个需要的库都应包含在最终的 ELF 文件中(多处理也是如此)。但我也尝试通过编辑 .spec 文件中的 hidden-import
部分来显式包含多处理库。
我还尝试冻结较旧的 Solaris 10 机器中的源代码以确保向后兼容。使用和不使用像 -lrt
这样的特殊 LDFLAGS 编译 PyInstaller 引导加载程序。使用 --debug
标志。但到目前为止,没有任何效果,也没有给我任何线索。
显然二进制文件是为正确的架构正确构建的,没有库问题:
root@dest01a # file testfer.r004
testfer.r004: ELF 32-bit MSB executable SPARC32PLUS Version 1, V8+ Required, UltraSPARC1 Extensions Required, dynamically linked, stripped
root@dest01a # crle
Platform: 32-bit MSB SPARC
Default Library Path (ELF): /lib:/usr/lib (system default)
Trusted Directories (ELF): /lib/secure:/usr/lib/secure (system default)
root@dest01a # ldd -r testfer.r004
libdl.so.1 => /lib/libdl.so.1
libm.so.2 => /lib/libm.so.2
libz.so.1 => /lib/libz.so.1
librt.so.1 => /lib/librt.so.1
libc.so.1 => /lib/libc.so.1
root@dest01a # ldd -r /lib/libsocket.so.1
libnsl.so.1 => /lib/libnsl.so.1
libc.so.1 => /lib/libc.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
libsoftcrypto.so.1 => /lib/libsoftcrypto.so.1
libelf.so.1 => /lib/libelf.so.1
libcryptoutil.so.1 => /lib/libcryptoutil.so.1
libz.so.1 => /lib/libz.so.1
libm.so.2 => /lib/libm.so.2
所以我运行没主意了。
提前感谢您的任何见解。
更新:感谢 Andrew Henle 的评论,我已经取得了一些进展。我再次重新编译了 PyInstaller 引导加载程序,但这次将 LDFLAGS 环境变量设置为 LDFLAGS="-lsocket -lrt"
.
现在它不再抱怨 __xnet
符号,而是 symbol get_fips_mode
。如您所见:
root@lnrep01a # ./testfer.r004
ld.so.1: testfer.r004: fatal: relocation error: file /lib/libsoftcrypto.so.1: symbol get_fips_mode: referenced symbol not found
Killed
所以我可能只需要在编译过程中添加一些额外的标志。我会在互联网上寻找它们,但如果有人知道缺少什么,那将非常受欢迎。
原来这不是 gcc 错误。在深入分析了这两种环境之后,我意识到 /lib/libsoftcrypto.so.1
库有很大的不同。事实上,编译器机器中的库包含 get_fips_mode
符号...
[root@zgv-wodbuild01 pyinstaller]# nm /lib/libsoftcrypto.so.1 | grep -i get_fips_mode
[3438] | 623016| 212|FUNC |GLOB |0 |18 |get_fips_mode
...而目标机器没有:
root@dest01a # nm /lib/libsoftcrypto.so.1 | grep -i get_fips_mode
[3755] | 0| 0|FUNC |GLOB |0 |UNDEF |get_fips_mode
在尝试另一台具有相似库版本的编译器机器后,使用 -lsocket
ldflag 编译 pyinstaller 引导加载程序就足够了:
root@dest01a # ./testferv3
hello fer
root@dest01a # echo $?
0
我正在尝试冻结并在我的 Solaris11 机器之间分发以下 python 使用多处理模块的代码:
import multiprocessing
def f(name):
print 'hello', name
if __name__ == '__main__':
p = multiprocessing.Process(target=f, args=('fer',))
p.start()
p.join()
但是,即使可执行文件在编译器机器 (Solaris11) 下工作正常...
[root@zgv-wodbuild01 pyinstaller]# testfer/dist/testfer
hello fer
[root@zgv-wodbuild01 pyinstaller]# echo $?
0
...抱怨任何其他机器 (Solaris11) 中的多处理库:
root@dest01a # ./testfer.r004
Traceback (most recent call last):
File "testfer.py", line 1, in <module>
File "/root/pyinstaller/PyInstaller/loader/pyimod03_importers.py", line 389, in load_module
File "multiprocessing/__init__.py", line 84, in <module>
File "/root/pyinstaller/PyInstaller/loader/pyimod03_importers.py", line 546, in load_module
ImportError: ld.so.1: testfer.r004: fatal: relocation error: file /tmp/_MEIlBa4uh/_multiprocessing.so: symbol __xnet_sendmsg: referenced symbol not found
Failed to execute script testfer
root@dest01a # echo $?
255
PyInstaller 命令已使用 --onefile
标志启动,因此每个需要的库都应包含在最终的 ELF 文件中(多处理也是如此)。但我也尝试通过编辑 .spec 文件中的 hidden-import
部分来显式包含多处理库。
我还尝试冻结较旧的 Solaris 10 机器中的源代码以确保向后兼容。使用和不使用像 -lrt
这样的特殊 LDFLAGS 编译 PyInstaller 引导加载程序。使用 --debug
标志。但到目前为止,没有任何效果,也没有给我任何线索。
显然二进制文件是为正确的架构正确构建的,没有库问题:
root@dest01a # file testfer.r004
testfer.r004: ELF 32-bit MSB executable SPARC32PLUS Version 1, V8+ Required, UltraSPARC1 Extensions Required, dynamically linked, stripped
root@dest01a # crle
Platform: 32-bit MSB SPARC
Default Library Path (ELF): /lib:/usr/lib (system default)
Trusted Directories (ELF): /lib/secure:/usr/lib/secure (system default)
root@dest01a # ldd -r testfer.r004
libdl.so.1 => /lib/libdl.so.1
libm.so.2 => /lib/libm.so.2
libz.so.1 => /lib/libz.so.1
librt.so.1 => /lib/librt.so.1
libc.so.1 => /lib/libc.so.1
root@dest01a # ldd -r /lib/libsocket.so.1
libnsl.so.1 => /lib/libnsl.so.1
libc.so.1 => /lib/libc.so.1
libmp.so.2 => /lib/libmp.so.2
libmd.so.1 => /lib/libmd.so.1
libsoftcrypto.so.1 => /lib/libsoftcrypto.so.1
libelf.so.1 => /lib/libelf.so.1
libcryptoutil.so.1 => /lib/libcryptoutil.so.1
libz.so.1 => /lib/libz.so.1
libm.so.2 => /lib/libm.so.2
所以我运行没主意了。 提前感谢您的任何见解。
更新:感谢 Andrew Henle 的评论,我已经取得了一些进展。我再次重新编译了 PyInstaller 引导加载程序,但这次将 LDFLAGS 环境变量设置为 LDFLAGS="-lsocket -lrt"
.
现在它不再抱怨 __xnet
符号,而是 symbol get_fips_mode
。如您所见:
root@lnrep01a # ./testfer.r004
ld.so.1: testfer.r004: fatal: relocation error: file /lib/libsoftcrypto.so.1: symbol get_fips_mode: referenced symbol not found
Killed
所以我可能只需要在编译过程中添加一些额外的标志。我会在互联网上寻找它们,但如果有人知道缺少什么,那将非常受欢迎。
原来这不是 gcc 错误。在深入分析了这两种环境之后,我意识到 /lib/libsoftcrypto.so.1
库有很大的不同。事实上,编译器机器中的库包含 get_fips_mode
符号...
[root@zgv-wodbuild01 pyinstaller]# nm /lib/libsoftcrypto.so.1 | grep -i get_fips_mode
[3438] | 623016| 212|FUNC |GLOB |0 |18 |get_fips_mode
...而目标机器没有:
root@dest01a # nm /lib/libsoftcrypto.so.1 | grep -i get_fips_mode
[3755] | 0| 0|FUNC |GLOB |0 |UNDEF |get_fips_mode
在尝试另一台具有相似库版本的编译器机器后,使用 -lsocket
ldflag 编译 pyinstaller 引导加载程序就足够了:
root@dest01a # ./testferv3
hello fer
root@dest01a # echo $?
0