4

I used Yocto to build and install Python and python-twisted on Ubuntu x86, Raspberry Pi, BeagleBone Black, and a TI AM57XX EVM ( Dev Kit ). Python-Twisted has no problem importing all the aforementioned machines except for the AM57XX Dev Kit. It spits the following error out:

Python 2.7.11 (default, Aug  7 2017, 12:07:27)
[GCC 5.3.1 20160113] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from txdbus import client,error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/txdbus/client.py", line 11, in <module>
    from twisted.internet import defer, reactor
  File "/usr/lib/python2.7/site-packages/twisted/internet/reactor.py", line 39, in <module>
  File "/usr/lib/python2.7/site-packages/twisted/internet/epollreactor.py", line 405, in install
  File "/usr/lib/python2.7/site-packages/twisted/internet/epollreactor.py", line 235, in __init__
  File "/usr/lib/python2.7/site-packages/twisted/internet/base.py", line 498, in __init__
  File "/usr/lib/python2.7/site-packages/twisted/internet/posixbase.py", line 289, in installWaker
  File "/usr/lib/python2.7/site-packages/twisted/internet/posixbase.py", line 139, in __init__
  File "/usr/lib/python2.7/site-packages/twisted/internet/fdesc.py", line 25, in setNonBlocking
AttributeError: 'NoneType' object has no attribute 'fcntl'

If I launch Python on the board and try to import the fcntl module, it is indeed missing:

Python 2.7.11 (default, Aug  7 2017, 12:07:27)
[GCC 5.3.1 20160113] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import fcntl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named fcntl

The package lists are the same on each machine. What am I missing? Does the kernel need to be configured differently?

While I was Googling around, I found this post: https://lists.yoctoproject.org/pipermail/yocto/2013-May/013953.html

It seems to show that Python from Yocto has an issue and is misconfigured so that it does not include the fcntl module:

>> ImportError: No module named fcntl
>> ========
>> 
>> So it looks like the Python included with the SDK is crippled or mis-configured:
> 
> Yeah, the Python we build is split up massively, so clearly the SDK is
> missing the packages that are needed to run bitbake.  But as I said,
> using our SDK to build is over-complicating things as Ubuntu should
> work fine.  What problems were you seeing?

When Yocto builds Python the log.do_package script mentions dependencies required for python-fcntl - but they don't seem like errors:

log.do_package:DEBUG: runstrip: 'arm-linux-gnueabihf-strip' --remove-section=.comment --remove-section=.note --strip-unneeded '/home/me/am57xx/build/tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/python/2.7.11-r1/package/usr/lib/python2.7/lib-dynload/fcntl.so'
log.do_package:DEBUG: LIBNAMES: pkg python-fcntl libs 0 bins 0 sonames []
log.do_package:DEBUG: calculating shlib provides for python-fcntl
log.do_package:DEBUG: LIBNAMES: pkg python-fcntl sonames []
log.do_package:DEBUG: calculating shlib requirements for python-fcntl
log.do_package:DEBUG: python-fcntl: Dependency libpython2.7.so.1.0 requires package libpython2 (used by files: /home/me/am57xx/build/tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/python/2.7.11-r1/packages-split/python-fcntl/usr/lib/python2.7/lib-dynload/fcntl.so)
log.do_package:DEBUG: python-fcntl: Dependency libc.so.6 requires package external-linaro-toolchain (used by files: /home/me/am57xx/build/tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/python/2.7.11-r1/packages-split/python-fcntl/usr/lib/python2.7/lib-dynload/fcntl.so)
log.do_package.17147:DEBUG: runstrip: 'arm-linux-gnueabihf-strip' --remove-section=.comment --remove-section=.note --strip-unneeded '/home/me/am57xx/build/tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/python/2.7.11-r1/package/usr/lib/python2.7/lib-dynload/fcntl.so'
log.do_package.17147:DEBUG: LIBNAMES: pkg python-fcntl libs 0 bins 0 sonames []
log.do_package.17147:DEBUG: calculating shlib provides for python-fcntl
log.do_package.17147:DEBUG: LIBNAMES: pkg python-fcntl sonames []
log.do_package.17147:DEBUG: calculating shlib requirements for python-fcntl
log.do_package.17147:DEBUG: python-fcntl: Dependency libpython2.7.so.1.0 requires package libpython2 (used by files: /home/me/am57xx/build/tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/python/2.7.11-r1/packages-split/python-fcntl/usr/lib/python2.7/lib-dynload/fcntl.so)
log.do_package.17147:DEBUG: python-fcntl: Dependency libc.so.6 requires package external-linaro-toolchain (used by files: /home/me/am57xx/build/tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/python/2.7.11-r1/packages-split/python-fcntl/usr/lib/python2.7/lib-dynload/fcntl.so)
log.do_populate_sysroot:DEBUG: runstrip: 'arm-linux-gnueabihf-strip' --remove-section=.comment --remove-section=.note --strip-unneeded '/home/me/am57xx/build/tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/python/2.7.11-r1/sysroot-destdir/usr/lib/python2.7/lib-dynload/fcntl.so'
log.do_populate_sysroot.17148:DEBUG: runstrip: 'arm-linux-gnueabihf-strip' --remove-section=.comment --remove-section=.note --strip-unneeded '/home/me/am57xx/build/tmp-external-linaro-toolchain/work/armv7ahf-neon-linux-gnueabi/python/2.7.11-r1/sysroot-destdir/usr/lib/python2.7/lib-dynload/fcntl.so'

So I think it built the module but could not package it into my Root File System.

I downloaded the Python source and ran configure with "help" and searched for fcntl.

./configure --help | grep fcntl

However, there are no results!

What can I do to my Yocto configuration or Python Recipe to have fcntl deployed to the Root File System?

PhilBot
  • 748
  • 18
  • 85
  • 173
  • `./configure --help | grep fcntl` shouldn't yield any results. You could `cat configure | grep fcntl` and `cat setup.py | grep fcntl`, but I don't know how relevant it would be. I know squat about _Yocto_, but do you have access to the _Python_ build logs? What about the build dir (to check if _fcntl.so_ is present)? – CristiFati Aug 19 '17 at 15:13

2 Answers2

1

This is an old thread but I had to search up and down for this topic to solve it.

On my Yocto "poky" build, the fcntl is on target device at

/usr/lib/python2.7/lib-dynload/fcntl.so

Yocto rearranged and removed some python modules to save space including subprocess and fcntl on my distro.

To add it, find any bb/inc file that creates image, add the following

IMAGE_INSTALL_append = " python-fcntl "

Then rebuild rootfs or final image. The file should appear at

./build/tmp/.../rootfs/usr/lib/python2.7/lib-dynload/fcntl.so

You can copy this file to your target machine for testing.

0

Use that latest Recipe from Yocto to build the latest Python 2.7.

PhilBot
  • 748
  • 18
  • 85
  • 173