历史上的今天
返回首页

历史上的今天

今天是:2025年02月16日(星期日)

正在发生

2020年02月16日 | 交叉编译Python-2.7.13到ARM(aarch32)—— 支持sqlite3

2020-02-16 来源:eefocus

环境

主机: ubuntu14.04 64bit


开发板: qemu + vexpress-a9 (参考: http://www.cnblogs.com/pengdonglin137/p/6442583.html)


工具链: arm-none-linux-gnueabi-gcc  (gcc version 4.8.3 20140320)


Python版本: Python-2.7.13


前面一篇博文(交叉编译Python-2.7.13到ARM(aarch32)平台)介绍了移植python到aarch32上面,但是发现有很多模块都不能用,可以在板子上面执行下面的命令测试一下:


 1 [root@vexpress ]# python /usr/lib/python2.7/test/test___all__.py

 2 Traceback (most recent call last):

 3   File "/usr/lib/python2.7/test/test___all__.py", line 3, in

 4     import unittest

 5   File "/usr/lib/python2.7/unittest/__init__.py", line 58, in

 6     from .result import TestResult

 7   File "/usr/lib/python2.7/unittest/result.py", line 9, in

 8     from . import util

 9   File "/usr/lib/python2.7/unittest/util.py", line 2, in

10     from collections import namedtuple, OrderedDict

11   File "/usr/lib/python2.7/collections.py", line 20, in

12     from _collections import deque, defaultdict

13 ImportError: No module named _collections


可以看到这里找不到_collections模块。


对比x86_64的编译结果:


1 ls x86_64/build/lib.linux-x86_64-2.7/

2 array.so*       _codecs_hk.so*       cPickle.so*       _curses_panel.so*  future_builtins.so*  itertools.so*      mmap.so*              parser.so*    _socket.so*   _sysconfigdata.py   time.so*

3 audioop.so*     _codecs_iso2022.so*  crypt.so*         _curses.so*        grp.so*              _json.so*          _multibytecodec.so*   pyexpat.so*   spwd.so*      _sysconfigdata.pyc  unicodedata.so*

4 binascii.so*    _codecs_jp.so*       cStringIO.so*     datetime.so*       _hashlib.so*         linuxaudiodev.so*  _multiprocessing.so*  _random.so*   _sqlite3.so*  _sysconfigdata.pyo  zlib.so*

5 _bisect.so*     _codecs_kr.so*       _csv.so*          _elementtree.so*   _heapq.so*           _locale.so*        nis.so*               readline.so*  _ssl.so*      syslog.so*

6 cmath.so*       _codecs_tw.so*       _ctypes.so*       fcntl.so*          _hotshot.so*         _lsprof.so*        operator.so*          resource.so*  strop.so*     termios.so*

7 _codecs_cn.so*  _collections.so*     _ctypes_test.so*  _functools.so*     _io.so*              math.so*           ossaudiodev.so*       select.so*    _struct.so*   _testcapi.so*


而aarch32的编译结果:


1 $ls aarch32/build/lib.linux2-arm-2.7/

2 audioop.so*     _codecs_iso2022.so*  _codecs_tw.so*  _ctypes.so*       _elementtree.so*     _json.so*          mmap.so*              nis.so*      resource.so*        termios.so*

3 _codecs_cn.so*  _codecs_jp.so*       crypt.so*       _ctypes_test.so*  future_builtins.so*  linuxaudiodev.so*  _multibytecodec.so*   parser.so*   _sysconfigdata.py   _testcapi.so*

4 _codecs_hk.so*  _codecs_kr.so*       _csv.so*        datetime.so*      _hotshot.so*         _lsprof.so*        _multiprocessing.so*  pyexpat.so*  _sysconfigdata.pyc


可以看到,aarch32上面缺少了很多库, 比如_collections.so,将来这些库会被安装到/usr/lib/python2.7/lib-dynload下面, 所以下面要说的就是将缺少的这些库弄回来!


正文

1、通过分析setup.py发现问题

在函数build_extensions中刚开始self.extensions中存放的是需要编译库, 通过在加打印:


 1 diff --git a/setup.py b/setup.py

 2 index 54054c2..bc16bb1 100644

 3 --- a/setup.py

 4 +++ b/setup.py

 5 @@ -178,6 +178,7 @@ class PyBuildExt(build_ext):

 6  

 7      def build_extensions(self):

 8  

 9 +        print "build_extensions enter."

10          # Detect which modules should be compiled

11          missing = self.detect_modules()

12  

13 @@ -191,6 +192,9 @@ class PyBuildExt(build_ext):

14              extensions.append(ctypes)

15          self.extensions = extensions

16  

17 +        for ext in self.extensions:

18 +            print "extensions: ", ext.name

19 +

20          # Fix up the autodetected modules, prefixing all the source files

21          # with Modules/ and adding Python's include directory to the path.

22          (srcdir,) = sysconfig.get_config_vars('srcdir')

23 @@ -217,6 +221,8 @@ class PyBuildExt(build_ext):

24          # Python header files

25          headers = [sysconfig.get_config_h_filename()]

26          headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))

27 +

28 +        print "builtin_module_names: ", sys.builtin_module_names

29          for ext in self.extensions[:]:

30              ext.sources = [ find_module_file(filename, moddirlist)

31                              for filename in ext.sources ]

32 @@ -248,10 +254,15 @@ class PyBuildExt(build_ext):

33                  remove_modules.append(line[0])

34              input.close()

35  

36 +        print "remove_modules: ", remove_modules

37 +

38          for ext in self.extensions[:]:

39              if ext.name in remove_modules:

40                  self.extensions.remove(ext)

41  

42 +        for ext in self.extensions[:]:

43 +            print "extensions: ", ext.name

44 +

45          # When you run "make CC=altcc" or something similar, you really want

46          # those environment variables passed into the setup.py phase.  Here's

47          # a small set of useful ones.

48 @@ -1618,13 +1629,13 @@ class PyBuildExt(build_ext):

49  

50  

51          # Platform-specific libraries

52 -        if host_platform == 'linux2':

53 +        if host_platform == 'linux2' or host_platform == 'linux2-arm':

54              # Linux-specific modules

55              exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )

56          else:

57              missing.append('linuxaudiodev')

58  

59 -        if (host_platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',

60 +        if (host_platform in ('linux2','linux2-arm' 'freebsd4', 'freebsd5', 'freebsd6',

61                          'freebsd7', 'freebsd8')

62              or host_platform.startswith("gnukfreebsd")):

63              exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )

64 @@ -1755,6 +1766,10 @@ class PyBuildExt(build_ext):

65  ##         ext = Extension('xx', ['xxmodule.c'])

66  ##         self.extensions.append(ext)

67  

68 +#        print "missing: ", missing

69 +#        for ext in self.extensions:

70 +#            print "extensions: ", ext.name

71 +

72          return missing

73  

74      def detect_tkinter_explicitly(self):

75 @@ -2229,6 +2244,8 @@ Topic :: Software Development

76  """

77  

78  def main():

79 +    print "sys.path: ", sys.path

80 +    print "cross_compiling: ", cross_compiling

81      # turn off warnings when deprecated modules are imported

82      import warnings

83      warnings.filterwarnings("ignore",category=DeprecationWarning)


然后执行./mk2_make.sh可以看到:


 1 sys.path:  ['/home/pengdonglin/src/qemu/python_cross_compile/Python-2.7.13', '/home/pengdonglin/src/qemu/python_cross_compile/aarch32/build/lib.linux2-arm-2.7', '/home/pengdonglin/src/qemu/python_cross_compile/Python-2.7.13/Lib', '/home/pengdonglin/src/qemu/python_cross_compile/Python-2.7.13/Lib/plat-linux2', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload']

推荐阅读

史海拾趣

ATOP_Technologies公司的发展小趣事

面对未来,ATOP Technologies制定了明确的战略规划。公司将继续加大在研发和创新方面的投入,推动产品向高端化、智能化方向发展。同时,ATOP Technologies还将积极拓展新的应用领域和市场渠道,寻求更多的合作伙伴和机会。此外,公司还将注重人才培养和团队建设,为公司的长远发展奠定坚实的基础。

这些故事只是ATOP Technologies发展历程中的一部分,每个故事都反映了公司在不同阶段的努力和成就。然而,由于具体细节可能涉及公司内部信息,因此我无法提供更为详细和具体的故事内容。如需了解更多关于ATOP Technologies的信息,建议查阅相关新闻报道或公司官方资料。

世纪金光(CENGOL)公司的发展小趣事

随着新能源汽车市场的快速发展,世纪金光敏锐地捕捉到了这一领域的巨大潜力。公司迅速组建专项研发团队,基于碳化硅技术开展新能源汽车电机驱动系统的研发工作。经过不懈努力,世纪金光成功开发出基于碳化硅技术的新能源汽车电机驱动系统,并在技术上取得了重要进展。这一成果不仅提升了新能源汽车的性能和效率,也为公司打开了新的市场空间。

常州星海电子(Starsea)公司的发展小趣事

常州星海电子有限公司,自1990年成立以来,便以生产中英合资的各类二极管为起点,逐渐在电子行业中崭露头角。随着公司业务的不断发展和市场需求的增长,2016年,公司正式更名为常州星海电子股份有限公司,完成了从合资到股份制的转变。这一转变不仅标志着公司管理结构的升级,也预示着公司在未来市场中的更大发展。

ELESTA GmbH公司的发展小趣事

2013年,ELESTA公司更名为ELESTA GmbH,这一品牌重塑标志着公司进入了新的发展阶段。同时,ELESTA也开始实施全球化战略,积极拓展国际市场,通过不断提升产品质量和服务水平,赢得了全球客户的信赖和认可。

Aerotronics Marketing Inc公司的发展小趣事

Aerotronics Marketing Inc公司在电子行业中崭露头角,源于其一项革命性的无人机技术。公司研发团队历经数年努力,成功开发出一款具有高精度导航和稳定飞行能力的无人机,广泛应用于农业监测、地质勘探等领域。这一技术的推出,不仅填补了市场空白,还为公司赢得了大量订单和合作伙伴,推动了公司的快速发展。

GCi Technologies公司的发展小趣事
使用定时器设置所需的充电时间。

问答坊 | AI 解惑

关于GPS/GPRS以及ARCGIS的求助

谁有关于这方面的电子资料或好的书给我推荐一下,谢谢!…

查看全部问答>

交流电桥驱动

帮我看看    频率5KHz    驱动传感器    在接上传感器输出波形变形 (自激振荡)   u3没用        请大家帮我…

查看全部问答>

触摸屏重启后出现了偏移现象

在校准后触摸屏可以正常工作。点击A点,显示上也是A点反应。但重启后点击A点,B点发生反应。针对这种触摸屏发生偏移的现象。我查看了一下四根数据线波形,与数据手册上的波形一致。在校准时我也查看了注册表,校准信息确实写入了注册表中,不知道问 ...…

查看全部问答>

LM3S5B91进入中断之后,中端口持续低电平,这是怎么回事?

LM3S5B91进入中断之后,中端口持续低电平,这是怎么回事?进入中段之后,有清除中断,但是,Io口依然保持低电平。     我做的是CH452的键盘扫描,中断方式,复位后,中端口为高电平,按下按键后,变为低电平,但是,在我松开手之后,应 ...…

查看全部问答>

想参加成都达内的培训

想参加成都达内的培训,不知道咋样,自己不是计算机专业的,但想往这方面发展,不知道达内咋样?自己主要想参加培训是因为现在没找到好的工作,自己虽然是学电子的,单现在的工作简直跟他风马牛不相及,而且工资很低,自己一点都不喜欢,自己虽然不 ...…

查看全部问答>

找到个坦克底座,看起来不错!

找到个坦克底座,看起来不错!就是价格高了点 …

查看全部问答>

求大神指导!终端请求和协调器绑定后,协调器能用0xFFFE作为目的地址发数据给终端吗?

我想把TI给的传感器实验和灯控制实验结合在一起,终端上有温度传感器和小灯,协调器上有按键作为开关,终端请求绑定成功后,周期性给协调器发送温度数据再通过串口显示在串口助手上,现在我想通过串口助手发个命令给协调器,协调器再发命令给终端实 ...…

查看全部问答>

EEWORLD大学堂----STM32 永磁同步电机(PMSM) FOC软件开发培训

STM32 永磁同步电机(PMSM) FOC软件开发培训:https://training.eeworld.com.cn/course/607内容包括:STM32产品技术介绍、马达控制套件、直流无刷马达介绍、FOC基础、磁链及力矩控制器、电流读取,转子的速度/位置反馈、Hall传感器、正交编码器、无 ...…

查看全部问答>

lInux下写文档的问题

我在linux下写了个文档,可是忽然就卡住了,如图: 点什么都没反应。请问高手,如何解决?谢谢! …

查看全部问答>

推荐一款电压传感器

各位朋友,能推荐一款高频电压传感器嘛?   待测量的信号是20KHz   正负400V以内的交流电压 小弟找的大部分都只能测6KHz以内的,希望有经验的可以指点迷津下,谢谢了! …

查看全部问答>