Я пытаюсь заморозить и распространять среди своих машин 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
Так что, возможно, мне просто нужно добавить некоторые дополнительные флаги в процесс компиляции. Я буду искать их через Интернет, но если кто-то знает, чего не хватает, это было бы более чем приятно.
'ldd' без вариантов не будет говорить вам, что нет никаких проблем библиотеки. Он просто сообщает вам, что все запрошенные библиотеки могут быть найдены - не все найденные символы могут быть найдены или что вам не хватает библиотеки полностью. Попробуйте 'ldd -r ...' заставить все необходимые перемещения. См. Https://docs.oracle.com/cd/E23823_01/html/816-5165/ldd-1.html Похоже, что вам не хватает зависимости от 'libsocket.so'. –
Вы правы. Я тоже пробовал это вчера, но, видимо, все в порядке с libsocket.so как на компиляторе, так и на конечной машине. Я редактировал сообщение, чтобы показать выходы 'ldd -r'. –
Вы все равно получаете символ '__xnet_sendmsg: ссылочный символ не найден' при запуске'./Testfer.r004', то? –