在Solaris中冻结(使用PyInstaller)python源代码(包括多处理模块)时出现问题

2024-04-19 12:48:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试冻结并在我的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)下运行良好。。。在

^{pr2}$

…抱怨任何其他计算机(Solaris11)中的多处理库:

^{3}$

PyInstaller命令已经用--onefile标志启动,因此每个需要的库都应该包含在最终的ELF文件中(也包括多处理)。但是我也尝试通过编辑.spec文件中的hidden-import部分来显式地包含多处理库。在

我还尝试在旧的solaris10机器中冻结源代码,以确保向后兼容。编译PyInstaller引导加载程序,无论是否使用特殊的LDFLAGS,如-lrt。使用--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

所以我没主意了。 提前感谢您的任何见解。在

更新:多亏了安德鲁·亨勒的评论,我才得以取得一些进展。我再次重新编译了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

所以我可能只需要在编译过程中添加一些额外的标志。我会在网上找他们,但如果有人知道他们缺少什么,那将是非常受欢迎的。在


Tags: 文件name标志librootlibcpyinstallerelf
1条回答
网友
1楼 · 发布于 2024-04-19 12:48:45

结果不是gcc的错误。在深入分析了这两种环境之后,我发现/lib/libsoftcrypto.so.1库有很大的不同。{作为一个编译器,}在cd2中包含一个事实。。。在

[root@zgv-wodbuild01 pyinstaller]# nm /lib/libsoftcrypto.so.1  | grep -i get_fips_mode
[3438]  |    623016|       212|FUNC |GLOB |0    |18     |get_fips_mode

…而目标计算机没有:

^{pr2}$

在尝试使用类似库版本的另一台编译器计算机后,使用-lsocketldflag编译pyinstaller引导加载程序就足够了:

^{3}$

相关问题 更多 >