2016-03-03 2 views
24

Я пытаюсь встать и работать с AWS Lambda Python (новичок в Python), но с некоторыми проблемами с учетом зависимости от MySQL. Я стараюсь следовать инструкциям here на моем Mac.Проблемы с использованием MySQL с AWS Lambda в Python

На номере шага 3, я получаю некоторые проблемы с выполнением команды в корне моего проекта

sudo pip install MySQL-python -t/

Ошибка:

Exception: Traceback (most recent call last): File "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/basecommand.py", line 122, in main status = self.run(options, args) File "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/commands/install.py", line 311, in run os.path.join(options.target_dir, item) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 292, in move raise Error, "Destination path '%s' already exists" % real_dst Error: Destination path '/MySQL_python-1.2.5-py2.7.egg-info/MySQL_python-1.2.5-py2.7.egg-info' already exists

Я заканчиваю писать свои следующие функции лямбды (работы штраф на моем Mac), которая:

import MySQLdb 

def lambda_handler(event, context): 
    # Open database connection 
    db = MySQLdb.connect(...) 

    # prepare a cursor object using cursor() method 
    cursor = db.cursor() 

    sql = "SELECT * FROM Users" 

    try: 
     # Execute the SQL command 
     cursor.execute(sql) 
     # Fetch all the rows in a list of lists. 
     results = cursor.fetchall() 
     for row in results: 
     fname = row[0] 
     lname = row[1] 
     age = row[2] 
     sex = row[3] 
     income = row[4] 
     # Now print fetched result 
     print ("lname=%s" %(lname)) 
    except: 
     print "Error: unable to fecth data" 

    # disconnect from server 
    db.close() 

То, что я пошел на сделать, это пойти в/Library/Python/2. 7/site-packages и копирование по папкам/файлам MySQLdb, которые были загружены, когда я сделал sudo pip, установить MySQL-python (без -t /) (я уверен, что я делаю что-то не так), к моему проекту лямбда , а затем закрепили содержимое вместе с lambda_function.py и загрузили в AWS Lambda.

Тогда я получаю:

Unable to import module 'lambda_function': No module named MySQLdb

признателен за любую помощь и предложения!

EDIT

был в состоянии сделать сделать Судо пип установить MySQL-питон -t/pathToProject работу (спасибо за помощь в комментариях), но теперь я получаю это когда подножку функции лямбды:

Unable to import module 'lambda_function': /var/task/_mysql.so: invalid ELF header

Я знаю, что если я работаю на Linux-боксе, то он должен работать нормально (как это было предложено некоторыми людьми), но мне интересно, могу ли я заставить его работать из окна OS X.

+0

Что такое вывод 's python -c 'import sys; print (sys.path)" '? Почему вы используете системный python? Разве вы не установили его в своем пути '/ usr/local' с помощью homebrew или macports? Если нет, вы должны. Вам не нужно использовать 'sudo' для pip, потому что он будет принадлежать вашему собственному пользователю и не будет изменять файлы, принадлежащие системе. Кроме того, он будет полностью отделен от питона, от которого зависит ваша система. Это также будет более новая версия, так как она из репозитория. –

+0

Если у вас его нет, установите homebrew с инструкцией 'curl' с' http: // brew.sh', а затем запустите 'brew install python'' pip install MySQLdb'. Убедитесь, что ваш python находится в/usr/local/bin, запустив 'which python' - homebrew будет устанавливать переменную $ PATH для поиска в'/usr/local/', чтобы найти правильный питон. –

+0

Спасибо за комментарии, будет использовать homebrew для установки. Будем держать вас в курсе (btw Я новичок в Python, поэтому спасибо, что помогли мне разгоняться) –

ответ

-1

Я считаю, что ваша проблема в основном сводится к отсутствующим пакетам разработки. Я думаю, вам нужно следующее:

Sudo ням -y установить MySQL-разви

+0

OS X эквивалент? –

+0

http://stackoverflow.com/a/35886213/3479860 –

+0

Ах, извините, не было этого для моего Mac, но я действительно установил модуль MySQLdb pip на моем Mac. У вас уже установлен mysql на вашем Mac? Если нет, то http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg – rahimbah

-3

Проблема происходит так же в мой инсталлятор Ubuntu, реальная проблема в том, что он находится на рассмотрении в драйвере соединителя MySQL клиента. Таким образом, решение устанавливает пакет клиента-dev Mysql, чтобы сделать MySQL-python счастливым (чтобы использовать клиентскую библиотеку).

# Ubuntu only(or setup vm for ubuntu inside your mac) 
# Three dependencies for MySQL python recompilation 
sudo apt-get install python-dev libssl-dev 

#Now the mysql client-dev 
sudo apt-get install libmysqlclient-dev 

# If you like mariadb client 
sudo apt-get install libmariadbclient-dev 

Для MAC

# try this first 
fink install mysql-unified-dev 

# or this if above fail. 
brew install mysql 
# you must add this to your user profile startup if you use brew 
export PATH=$PATH:/usr/local/mysql/bin 

Вы можете получить подобный ответ здесь: Mac OS X - EnvironmentError: mysql_config not found

Тогда попробуйте установить пип.

Я не рекомендую никому пользоваться «sudo pip». Вы должны настроить Virtualenv и virtualwrapper для разработки вашего python, которые позволят вам пипеть без sudo. И проще изолировать и протестировать новое развертывание. (хотя он не исправляет проблему с библиотекой mysqlclient-dev)

0

Для создания пакетов python вам необходимо использовать экземпляр Amazon Linux, а затем включить их в свой пакет развертывания Lambda. Отъезд this excellent article о том, как это сделать.Пакеты, упомянутые в статье, отличаются от тех, которые вам нужны, но аналогичным образом это помогло мне построить psycopg2 и pymssql для моих лямбдов.

+0

Интересно! Попробуй это, как только я вернусь из отпуска.Спасибо за предложение –

6

Для использования в качестве Lambda вы будете намного счастливее, используя чистую реализацию python, например PyMySQL.

Это замена для MySQLdb, которая следует за спецификацией Python Database API. Для большинства вещей, таких как инициированные события Lambda, это будет так же быстро.

Я использовал его в производстве много, и он отлично работает.

+0

Я получаю сообщение об ошибке 'ImportError: Нет модуля с именем MySQLdb', когда я заменяю MySQLdb на PyMySQL для моих моделей sqlalchemy. – Hussain

+0

@systemjack: можете ли вы сообщить мне, как вы включили pymysql в свою lamda. – Nipun

+0

@ Hussain Мы не используем sqlalchemy, поэтому я не уверен, как сделать это с помощью pymysql. Вот некоторые ссылки, которые показывают базовое использование: http://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-deployment-pkg.html, http://docs.aws.amazon.com/lambda/ last/dg/lambda-python-how-to-create-deployment-package.html ... Вы должны использовать pip для его установки в своем каталоге проекта/пакете развертывания с опцией -t. – systemjack

0

Используя lambda-docker, вы можете настроить и протестировать свои лямбда-функции без доступа к подобной среде Linux.

Чтобы настроить вашу лямбду, используйте изображение сборки lambda-docker, чтобы запустить отдельный контейнер докера и выполнить команды pip install <package> на контейнере. Затем экспортируйте контейнер, возьмите установленные пакеты под номером usr/lib и поместите их в свой пакет AWS Lambda.

Затем вы можете проверить совместимость, запустив лямбду на изображении лямбда-докера. Если это сработает, продолжайте и загрузите в AWS Lambda с уверенностью.

docker run -d -v "$PWD":/var/task lambci/lambda:build-python2.7 tail -f /dev/null 

docker ps 

docker exec 0c55aae443e6 pip install pandas 

docker exec 0c55aae443e6 pip install sqlalchemy 

docker exec 0c55aae443e6 pip freeze 

docker exec 0c55aae443e6 python -c "import site; print(site.getsitepackages())" 

docker container export -o lambda_ready_container 0c55aae443e6 
Смежные вопросы