2016-09-21 5 views
1

Я пытаюсь заморозить и распространять среди своих машин Solaris11 следующий код питона, который делает использование многопроцессорной модуля:Проблема замораживания (с PyInstaller) источник питона включая модуль многопроцессорной в Solaris

import multiprocessing 

def f(name): 
    print 'hello', name 

if __name__ == '__main__': 
    p = multiprocessing.Process(target=f, args=('fer',)) 
    p.start() 
    p.join() 

Однако, даже если исполняемый файл прекрасно работает под компилятором машины (Solaris11) ...

[[email protected] pyinstaller]# testfer/dist/testfer 
hello fer 
[[email protected] pyinstaller]# echo $? 
0 

... жалуется на многопроцессорных библиотеку в любой другой машине (Solaris11):

[email protected] # ./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 
[email protected] # echo $? 
255 

Команда PyInstaller была запущена с флагом --onefile, поэтому каждая необходимая библиотека должна быть включена в финальный файл ELF (многопроцессорная обработка). Но я также попытался включить явную многопроцессорную библиотеку, отредактировав раздел hidden-import в файле .spec.

Я также попытался заморозить источник на старой машине Solaris 10, чтобы обеспечить обратную совместимость. Компиляция загрузчиков PyInstaller как с специальными LDFLAGS, так и без них, например -lrt. Использование флага --debug. Но пока ничего не работало и не давало мне подсказки.

Видимо двоичный правильно построен для правильной архитектуры, и нет никаких проблем библиотеки:

[email protected] # file testfer.r004 
testfer.r004: ELF 32-bit MSB executable SPARC32PLUS Version 1, V8+ Required, UltraSPARC1 Extensions Required, dynamically linked, stripped 

[email protected] # 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) 

[email protected] # 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 

[email protected] # 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. Как вы можете видеть:

[email protected] # ./testfer.r004 
ld.so.1: testfer.r004: fatal: relocation error: file /lib/libsoftcrypto.so.1: symbol get_fips_mode: referenced symbol not found 
Killed 

Так что, возможно, мне просто нужно добавить некоторые дополнительные флаги в процесс компиляции. Я буду искать их через Интернет, но если кто-то знает, чего не хватает, это было бы более чем приятно.

+0

'ldd' без вариантов не будет говорить вам, что нет никаких проблем библиотеки. Он просто сообщает вам, что все запрошенные библиотеки могут быть найдены - не все найденные символы могут быть найдены или что вам не хватает библиотеки полностью. Попробуйте 'ldd -r ...' заставить все необходимые перемещения. См. Https://docs.oracle.com/cd/E23823_01/html/816-5165/ldd-1.html Похоже, что вам не хватает зависимости от 'libsocket.so'. –

+0

Вы правы. Я тоже пробовал это вчера, но, видимо, все в порядке с libsocket.so как на компиляторе, так и на конечной машине. Я редактировал сообщение, чтобы показать выходы 'ldd -r'. –

+0

Вы все равно получаете символ '__xnet_sendmsg: ссылочный символ не найден' при запуске'./Testfer.r004', то? –

ответ

0

Оказалось, что это не ошибка gcc. Проанализировав глубину обеих сред, я понял, что библиотеки /lib/libsoftcrypto.so.1 сильно отличаются. В самом деле, библиотека в компиляторе машине содержит get_fips_mode символа ...

[[email protected] pyinstaller]# nm /lib/libsoftcrypto.so.1 | grep -i get_fips_mode 
[3438] | 623016|  212|FUNC |GLOB |0 |18  |get_fips_mode 

... в то время как машина назначения не:

[email protected] # nm /lib/libsoftcrypto.so.1 | grep -i get_fips_mode 
[3755] |   0|   0|FUNC |GLOB |0 |UNDEF |get_fips_mode 

После попытки другого компилятора машины с аналогичной библиотекой версия, составление pyinstaller загрузчиков с -lsocket ldflag было достаточно:

[email protected] # ./testferv3 
hello fer 
[email protected] # echo $? 
0 

 Смежные вопросы

  • Нет связанных вопросов^_^