【问题标题】:Python picamera on Buildroot?Buildroot上的Python picamera?
【发布时间】:2019-03-20 04:43:22
【问题描述】:

from picamera import PiCamera 在 buildroot 生成的 linux 映像上的 python3.7 中给出以下错误。感谢有关如何修复的建议。谢谢!

/usr/bin/python3.7: symbol 'mmal_port_pool_create': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_list_push_front': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_list_destroy': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_rational_to_fixed_16_16': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_status_to_string': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_list_push_back': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_list_create': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_list_insert': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_rational_equal': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_list_pop_front': can't resolve symbol
/usr/bin/python3.7: symbol 'mmal_port_type_to_string': can't resolve symbol
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.7/site-packages/picamera/__init__.py", line 72, in <module>
    from picamera.exc import (
  File "/usr/lib/python3.7/site-packages/picamera/exc.py", line 41, in <module>
    import picamera.mmal as mmal
  File "/usr/lib/python3.7/site-packages/picamera/mmal.py", line 49, in <module>
    _lib = ct.CDLL('libmmal.so')
  File "/usr/lib/python3.7/ctypes/__init__.py", line 356, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: dlopen() error

【问题讨论】:

标签: python raspberry-pi buildroot


【解决方案1】:

您需要选择rpi-userland 包。

我假设您在 Raspberry Pi 上工作,否则 picamera 不适合您。

picamera 尝试打开 libmmal.so 共享库。 rpi-userland Buildroot 包将下载、构建和安装这个库。

如果你为python-picamera 制作了一个Buildroot 包,你应该将select BR2_PACKAGE_RPI_USERLAND 添加到它的Config.in 文件中,并复制rpi-userland 包的依赖项。在python-picamera.mk 文件中,您应该添加PYTHON_PICAMERA_DEPENDENCIES += rpi-userland。这将确保在您启用 picamera 时始终选择并构建包。

另外,如果您有一个可用的python-picamera 包,请考虑在contribution guidelines 之后将其发送到上游。

如果您没有为 python-picamera 制作 Buildroot 包,那可能是问题的根源。 PyPI 的 picamera 包与特定版本的 libmmal 链接,该版本可能与 Buildroot 中的版本不同。这可能会导致您在导入模块时看到错误。

【讨论】:

  • 感谢您的提示。我已经在 buildroot 中选择了 rpi-userland 并且 libmmal.so 在 /usr/lib 中,但我仍然遇到上述错误。就 python-picamera 包而言,我没有将它包含在 buildroot 中(我想包含它,但我一般是 buildroot 和 makefile 的新手,所以我使用 menuconfig 做所有事情)。相反,我只是在运行我用 buildroot 制作的 linux 映像的 pi 上安装了带有 pip 的 picamera。如果您愿意指导我了解如何在 buildroot 中包含 picamera 包,我将不胜感激。
  • 这些符号确实存在于 libmmal.so AFAICS 中(要检查你的身边,你可以做 readelf -s output/target/usr/lib/libmmal.so 并验证所有这些符号都在那里)。也许 PyPI 的包和你的 Buildroot 构建之间存在二进制不兼容。
  • 感谢您的进一步建议。当我在托管 buildroot 的 Ubuntu VM 上运行 readelf -s output/target/usr/lib/libmmal.so 时,我看到其中列出了三个符号:mmal_port_pool_create、mmal_status_to_string 和 mmal_port_type_to_string,但其余的都不见了。这有什么线索吗?
  • 我现在意识到:如果您从 pypi 下载二进制文件而不是自己构建,那么该二进制文件可能与使用不同符号的不同版本的库链接。我认为您必须自己构建它,即将它添加为 Buildroot 包。运行utils/scanpypi picamera 并更新package/Config.in 就足够了。
  • 谢谢,这些步骤似乎适用于添加为 buildroot 包,但现在进入安装部分时制作失败:
【解决方案2】:

FWIW 我最终只使用了 raspistill...

  raspistill_params = (' -n'
  + ' -ISO ' + str(iso)
  + ' -ss ' + str(shutter_speed)
  + ' -mm ' + meter_mode
  + ' -ex ' + exposure_mode
  + ' --ev ' + str(exposure_compensation)
  + ' -awb ' + awb_mode
  + ' -br ' + str(brightness)
  + ' -co ' + str(contrast)
  + ' -sa ' + str(saturation)
  + ' -sh ' + str(sharpness)
  + ' -drc ' + drc_strength
  + ' -rot ' + str(rotation) 
  + ' -q ' + str(quality) 
  + ' -w ' + str(width) 
  + ' -h ' + str(height) 
  + ' -ae ' + str(annotate_text_size) + ',0xff,0x808000 '
  + ' -a "' + annotate_text + '"'
  + ' -x GPS.GPSLatitudeRef=' + exif_lat_ref(latitude)  
  + ' -x GPS.GPSLatitude=' + exif_latlong(latitude)  
  + ' -x GPS.GPSLongitudeRef=' + exif_long_ref(longitude)  
  + ' -x GPS.GPSLongitude=' + exif_latlong(longitude) 
  + ' -o ' + filename
  )

  proc = subprocess.Popen("raspistill " + raspistill_params, shell=True, stdout=subprocess.PIPE)
  ret_val = proc.communicate() 

【讨论】:

    【解决方案3】:
    sudo apt-get update
    sudo apt-get upgrade
    
    sudo raspi-config
    

    启用相机并重启

    【讨论】:

    • 谢谢,但我没有使用 raspbian,所以这行不通。
    • @NJS 如果您需要任何帮助,您必须提供更具体的信息
    猜你喜欢
    • 2016-07-26
    • 2019-06-25
    • 1970-01-01
    • 2018-06-02
    • 2015-05-17
    • 2020-08-16
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多