繁体   English   中英

尝试导入sqlite3模块时出现Python ImportError

[英]Python ImportError when attempting to import sqlite3 module

我试图交叉编译基于手臂的嵌入式设备的Python 2.7.3。 我已经成功地编译了它(基于这些说明: http : //randomsplat.com/id5-cross-compiling-python-for-embedded-linux.html ),并且所有测试都通过了目标设备,因此我我对构建过程的工作充满信心。 我已经交叉编译了sqlite3(版本3.8.5),并将其包含在python交叉编译过程中,似乎可以正常使用(不再列出在构建过程结束时未找到的模块中)。

我在尝试在目标设备上导入sqlite3库时遇到了困难,我收到下面列出的错误(python正在使用-v标志运行)。

Python 2.7.3 (default, Jul  7 2014, 19:06:12) 
[GCC 3.4.6] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlite3

import sqlite3 # directory /mnt/card/arm-python/lib/python2.7/sqlite3
# /mnt/card/arm-python/lib/python2.7/sqlite3/__init__.pyc matches /mnt/card/arm-python/lib/python2.7/sqlite3/__init__.py
import sqlite3 # precompiled from /mnt/card/arm-python/lib/python2.7/sqlite3/__init__.pyc
# /mnt/card/arm-python/lib/python2.7/sqlite3/dbapi2.pyc matches /mnt/card/arm-python/lib/python2.7/sqlite3/dbapi2.py
import sqlite3.dbapi2 # precompiled from /mnt/card/arm-python/lib/python2.7/sqlite3/dbapi2.pyc
dlopen("/mnt/card/arm-python/lib/python2.7/lib-dynload/datetime.so", 2);
import datetime # dynamically loaded from /mnt/card/arm-python/lib/python2.7/lib-dynload/datetime.so
dlopen("/mnt/card/arm-python/lib/python2.7/lib-dynload/time.so", 2);
import time # dynamically loaded from /mnt/card/arm-python/lib/python2.7/lib-dynload/time.so
dlopen("/mnt/card/arm-python/lib/python2.7/lib-dynload/_sqlite3.so", 2);
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/mnt/card/arm-python/lib/python2.7/sqlite3/__init__.py", line 24, in <module>
    from dbapi2 import *
  File "/mnt/card/arm-python/lib/python2.7/sqlite3/dbapi2.py", line 27, in <module>
    from _sqlite3 import *
ImportError: File not found

似乎在抱怨“找不到文件”,但是我已经遍历了输出中列出的所有路径,似乎所有文件都存在。 我有什么办法可以进一步诊断这个问题?

我设法使其正常运行,尽管我认为我不完全了解正在发生的事情,我对编译C / C ++代码以及整个静态/共享库和链接的工作方式并不熟悉,也许有人可以了解这里实际发生的情况。 无论如何,这是我已解决的方法。

首先,我在python进程上运行了strace(Linux调试实用程序):

strace /mnt/card/arm-python/bin/python

当python进程启动时,这会吐出大量输出,一旦解决,我就尝试导入sqlite库:

import sqlite3

然后,这将吐出更多的负载输出,其中大部分与打开要导入的模块中涉及的文件有关。 然后,我注意到它设法打开了_sqlite3.so但不久之后,它尝试加载libsqlite3.so ,该库在库路径($ LD_LIBRARY_PATH)中找不到。

open("/mnt/card/arm-python/lib/python2.7/lib-dynload/_sqlite3.so", O_RDONLY|O_LARGEFILE) = 5
...
open("/lib/libsqlite3.so.0", O_RDONLY)  = -1 ENOENT (No such file or directory)
open("/usr/lib/libsqlite3.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)

我将构建机器上交叉编译的sqlite库中/ lib目录中的/ lib目录中的libsqlite3.so.0.8.6复制到了嵌入式arm设备上的/mnt/card ,并将其重命名为libsqlite3.so.0 然后,我将/mnt/card添加到$ LD_LIBRARY_PATH中,因为该路径中的现有位置位于只读文件系统上。

然后,我尝试再次导入sqlite3,一切似乎都正常。 那么,这些东西在lib-dynload的作用以及libsqlite3.so.0的作用是libsqlite3.so.0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM