cx_freeze не может импортировать общую библиотеку psycopg2 во время выполнения

Я создал исполняемый файл с помощью cxfreeze (внутри виртуального окружения python3.2) на моей локальной машине. Исполняемый файл правильно работает на локальном компьютере.

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

  ...
  File "/home/chris/.virtualenvs/python3env/lib/python3.2/site-packages/psycopg2/__init__.py", line 67, in <module>
  File "ExtensionLoader_psycopg2__psycopg.py", line 18, in <module>
  ImportError: No module named None

Все зависимости разделяемой библиотеки выполняются на целевой машине (согласно ldd).

Основываясь на трассировке, я предполагаю, что psycopg2 пытается загрузить разделяемую библиотеку _psycopg.cpython-32mu.so (локально python3.2/site-packages/psycopg2/_psycopg.cpython-32mu.so), но не может найти ее во время выполнения.

Я попытался поместить библиотеку в тот же каталог, что и исполняемый файл, и установить LD_LIBRARY_PATH, но ни один из них не решил (предполагаемую) проблему.


person cmh    schedule 09.01.2013    source источник


Ответы (1)


После запуска strace в каждом процессе оказывается, что чистая версия Python ищет файл _psycopg.cpython-32mu.so

open("/home/chris/.virtualenvs/python3env/lib/python3.2/site-packages/psycopg2/_psycopg.cpython-32mu.so", O_RDONLY|O_CLOEXEC) = 8

В то время как двоичный файл, созданный cxfreeze, ищет файл psycopg2._psycopg.so

open("/path/to/psycopg2._psycopg.so", O_RDONLY|O_CLOEXEC) = 3

md5sum показывает, что эти файлы идентичны, поэтому процесс cxfreeze изменяет ожидаемое имя динамической библиотеки. Стоит отметить, что версия этой библиотеки с правильным названием для цели включена в каталог dist, выводимый cxfreeze.

person cmh    schedule 09.01.2013