rea*_*dul 5 python ocr ctypes aws-lambda
我在 Lambda 上使用的 python 包 (OCRMYPDF) 需要 leptonica 库liblept.so.5。在隔离导入代码时,我发现问题在于find_library('lept')。打印结果返回 None。
from ctypes.util import find_library
def lambda_handler(event, context):
liblept=find_library('lept')
print("liblept:%s"%liblept)
Run Code Online (Sandbox Code Playgroud)
我正在使用的 python 包需要许多本机编译的依赖项。我正在尝试使用 lambda 层导入它们。
/opt/
/opt/bin/
/opt/lib/
/opt/lib/liblept.so.5
/opt/tesseract
Run Code Online (Sandbox Code Playgroud)
我可以使用 CDLL 访问该文件(代码如下)。但我不想重写包并用 CDLL 替换每个 find_library() 。是否可以设置find_library的导入目录?
/opt/
/opt/bin/
/opt/lib/
/opt/lib/liblept.so.5
/opt/tesseract
Run Code Online (Sandbox Code Playgroud)
我使用了 docker 镜像来构建层。/opt/bin 中依赖于 leptonica 的文件正在运行(tesseract 运行正常,也测试了 OCR)。
liblept=CDLL("/opt/lib/liblept.so.5") # found
print("liblept:%s"%liblept)
Run Code Online (Sandbox Code Playgroud)
输出
START RequestId: d826d36c-4ce9-4b67-b501-8c9042edcf80 Version: $LATEST
tesseract 4.1.0
leptonica-1.78.0
libgif 5.1.4 : libjpeg 6b (libjpeg-turbo 1.2.90) : libpng 1.2.49 : libtiff 4.0.3 : zlib 1.2.8 : libwebp 0.3.0
Found AVX
Found SSE
END RequestId: d826d36c-4ce9-4b67-b501-8c9042edcf80
Run Code Online (Sandbox Code Playgroud)
在 Python:3.7 AWS lambda 环境上测试:
您需要添加liblept.so(只需重命名liblept.so.5)到/liblambda 包的文件夹或/opt/lib层中。必须调用该文件,liblept.so因为find_library只查找".so"文件,而不是".so.5"文件:
来自Python文档:https ://docs.python.org/3/library/ctypes.html
ctypes.util.find_library(name)
Try to find a library and return a pathname. name is the library name without any prefix like lib, suffix like .so, .dylib or version number (this is the form used for the posix linker option -l). If no library can be found, returns None.
Run Code Online (Sandbox Code Playgroud)
仅添加时"liblept.so",链接器抱怨找不到"liblept.so.5",所以我也添加"liblept.so.5"到lib文件夹中。
也许其他人可以参与并找到不使用重复文件的解决方案。
AWS lambda 将自动将任何文件放入/opt/lib或/lib通过LD_LIBRARY_PATH.
在 Python 3.8 上,您可能还需要包含ldand objdump,按照此线程: https: //forums.aws.amazon.com/thread.jspa? threadID=313506,尽管我还没有对此进行测试。
| 归档时间: |
|
| 查看次数: |
5483 次 |
| 最近记录: |