Как запустить 32-битные двоичные файлы на AWS лямбде, используя Python - PullRequest
1 голос
/ 20 марта 2020

AWS Lambda Python 3.8 runtime говорит, что может выполнять 32-битные библиотеки . У меня есть 32-битный исполняемый файл, который был встроен в C. Когда я выполняю следующий код - я получаю:

wrong ELF class: ELFCLASS32

Я пробовал то же самое на изображении Amazon Linux 2 docker. Ошибка, которую я получаю, такая же. возможно python дает CDLL 64-битный экземпляр.

Использование 32-битного docker образа из Ubuntu 32bit/ubuntu:16.04 работает нормально.

import platform 
print(platform.architecture())

Мне придется вызывать Python в 32-битной архитектуре.

C код:

#include <stdio.h>

int foo() {
    printf("Hello, world!\n");
    return 0;
}

Python код:

import ctypes

def lambda_handler(event, context):
    libhi = ctypes.CDLL("my32bitlib.so")
    libhi.foo()

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

lambda_handler(None, None)

1 Ответ

0 голосов
/ 21 марта 2020

Я почти уверен, https://aws.amazon.com/about-aws/whats-new/2018/09/amazon-linux-2-now-supports-32-bit-applications-and-libraries/ просто означает, что они установили gcc-multilib и так далее, чтобы в системе было доступно /usr/lib32/*.so, чтобы вы могли запускать 32-битные двоичные исполняемые файлы. И эти 32-битные исполняемые файлы в 32-битных процессах могут загружать 32-битные библиотеки.

Они не изобрели ни одного magi c, который позволял бы вам использовать 32-битную библиотеку из 64- бит Python процесс . Процессор будет в 64-битном режиме при выполнении кода пространства пользователя в этом процессе, и поэтому он не сможет правильно выполнять 32-битный машинный код x86 в 32-битной библиотеке.

Если они переключили обычный /usr/bin/python на 32-битный исполняемый файл, который сломал бы 64-битные библиотеки.

Я думаю, вы слишком оптимистично c о том, что эти новости объявление означает; это, вероятно, не относится к вам, потому что ваша программа написана на Python. Вы не можете смешивать 32- и 64-битный код, а обычная python по-прежнему является 64-битной программой.


Возможно, они установили 32-битную сборку Python, которую вы могли бы используйте, если вы хотите загрузить устаревшие 32-битные библиотеки в программу Python. Может быть, искать каталог python32 или двоичный файл, если так его называли? Но не удивляйтесь, если ничего не найдете.

Если это так, измените строку #!/usr/bin/python в начале вашего скрипта на правильный путь. Или установите свою собственную 32-битную Python сборку в / usr / local и используйте ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...