Используя Pyenchant в AWS Lambda, можно загружать пакеты, но не словари провайдеров, скомпилировать их из исходного кода в EC2 и извлечь файлы.so
Я пытаюсь использовать библиотеку проверки правописания Python Pyenchant в функции Lambda в AWS. Pyenchant - это оболочка для библиотеки C libenchant, которая, в свою очередь, использует словари от таких провайдеров, как Aspell.
В моем коде Python, работающем на Lambda, я могу успешно импортировать библиотеку enchant, скомпилировав ее и библиотеки C (libenchant.so) в экземпляр AWS linux EC2 и скопировав выходные данные в мой пакет развертывания Lambda.
Тем не менее, библиотека pyenchant не может загрузить ни один из словарей слов при запуске на Lambda, которые ей нужны для работы. Затем я установил Aspell на экземпляр EC2, используя:
yum install aspell-en enchant-aspell
Затем я скопировал следующие дополнительные файлы.so в папку / lib моего пакета развертывания:
- libaspell.so
- libenchant_aspell.so
- libenchant_ispell.so
- libenchant_myspell.so
- libenchant.so
Я почти уверен, что libenchant_aspell.so - это настоящий словарь, но он его не подбирает, и я не могу понять, куда идти дальше.
Ниже приведен мой код на языке lambda_handler:
from __future__ import print_function
import os
import sys
import re
import enchant
enchant.set_param("enchant.aspell.dictionary.path","/var/task/lib")
def lambda_handler(event, context):
print("# List available enchant dictionary languages")
print(enchant.list_languages())
b = enchant.Broker()
print("# List available enchant brokers")
print(b.describe())
d = enchant.Dict("en_GB")
# print(d.provider.name)
# print(d.provider.file)
return "Done"
И вот результат вызова функции Lambda:
START RequestId: 7539245b-d3d6-11e6-b7e6-edc1dc8cbdd4 Version: $LATEST
# List available enchant dictionary languages
[]
# List available enchant brokers
[]
Dictionary for language 'en_GB' could not be found: DictNotFoundError
Traceback (most recent call last):
File "/var/task/package_test.py", line 16, in lambda_handler
d = enchant.Dict("en_GB")
File "/var/task/enchant/__init__.py", line 558, in __init__
_EnchantObject.__init__(self)
File "/var/task/enchant/__init__.py", line 168, in __init__
self._init_this()
File "/var/task/enchant/__init__.py", line 565, in _init_this
this = self._broker._request_dict_data(self.tag)
File "/var/task/enchant/__init__.py", line 310, in _request_dict_data
self._raise_error(eStr % (tag,),DictNotFoundError)
File "/var/task/enchant/__init__.py", line 258, in _raise_error
raise eclass(default)
DictNotFoundError: Dictionary for language 'en_GB' could not be found
END RequestId: 7539245b-d3d6-11e6-b7e6-edc1dc8cbdd4
REPORT RequestId: 7539245b-d3d6-11e6-b7e6-edc1dc8cbdd4 Duration: 1.03 ms Billed Duration: 100 ms Memory Size: 256 MB Max Memory Used: 16 MB
Как вы видете import enchant
работает нормально, но не может найти файлы словаря.
Я действительно застрял в этом, потратил лучшую часть 6 часов, пытаясь выяснить, как заставить это работать. Заранее спасибо за помощь.
1 ответ
Что ж, для всех, кто сталкивался с этой проблемой (которая, вероятно, будет никем...), оказалось, что использовать этот пакет на Lambda невозможно. Что-то связанное с отсутствием необходимой инфраструктуры для загрузки ресурсов общих объектов на несколько уровней. В конце концов, я просто использовал флеш-веб-сервер на EC2, и он работал нормально.