cx_freeze无法在运行时导入psycopg2共享库

时间:2013-01-09 15:01:52

标签: python postgresql shared-libraries psycopg2 cx-freeze

我在本地计算机上使用cxfreeze(在python3.2 virtualenv中)构建了一个可执行文件。 可执行文件在本地计算机上正常运行。

我正在尝试在单独的目标计算机上运行可执行文件(具有相同的操作系统和体系结构),但是会出现以下错误:

  ...
  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,但都没有解决(假设)问题。

1 个答案:

答案 0 :(得分:0)

在每个进程上运行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进程似乎更改了动态库的预期名称。值得注意的是,cxfreeze输出的dist目录中包含了此库的正确名称​​的正确名称