ImportError: нет модуля с именем boto3 в экземпляре AWS EC2 - PullRequest
0 голосов
/ 11 февраля 2019

Я запускаю свой экземпляр AWS EC2 и при попытке запустить свое веб-приложение MyCoolApp.py я получаю следующую ошибку:

Traceback (most recent call last):   
File "MyCoolApp.py", line 9, in <module>
    import boto3
ImportError: No module named boto3

Это после того, как я пытаюсь запустить свое приложение, которое я делаю, и делал, прежде чем я сделал это последнее изменение с помощью следующей команды:

[ec2-user@ip-XXX-XXX-XXX-XXX CoolApp]$ sudo python MyCoolApp.py

Как вы можете догадаться, я пытаюсь импортировать Boto3 для использования, и я делаю это в моем приложении Python с помощью следующего кодавверху моей программы:

from werkzeug.security import check_password_hash, generate_password_hash
from datetime import datetime
import time, os, random, json
import urllib
import boto3

Наконец, поскольку я знаю, что вы спросите об этом, ДА, я уже установил Boto3, и когда я запускаю pip freeze, я вижу его.Это вывод ниже:

[ec2-user@ip-XXX-XXX-XXX-XXX CoolApp]$ pip freeze
alembic==0.9.9
aws-cfn-bootstrap==1.4
awscli==1.15.83
Babel==0.9.4
backports.ssl-match-hostname==3.4.0.2
blinker==1.4
boto==2.48.0
boto3==1.9.87
botocore==1.12.87
chardet==2.0.1
click==6.7
cloud-init==0.7.6
colorama==0.2.5
configobj==4.7.2
docutils==0.14
ecdsa==0.11
Flask==1.0.2
Flask-Login==0.4.1
Flask-Mail==0.9.1
Flask-Migrate==2.1.1
Flask-Mobility==0.1.1
Flask-SQLAlchemy==2.3.2
futures==3.2.0
hibagent==1.0.0
iniparse==0.3.1
itsdangerous==0.24
Jinja2==2.10
jmespath==0.9.3
jsonpatch==1.2
jsonpointer==1.0
kitchen==1.1.1
lockfile==0.8
Mako==1.0.7
MarkupSafe==1.0
mysql-connector-python==8.0.11
paramiko==1.15.1
PIL==1.1.6
pip-tools==3.3.2
ply==3.4
protobuf==3.5.2.post1
pyasn1==0.1.7
pycrypto==2.6.1
pycurl==7.19.0
pygpgme==0.3
pyliblzma==0.5.3
pystache==0.5.3
python-daemon==1.5.2
python-dateutil==2.7.3
python-editor==1.0.3
pyxattr==0.5.0
PyYAML==3.10
requests==1.2.3
rsa==3.4.1
s3transfer==0.1.13
simplejson==3.6.5
six==1.11.0
SQLAlchemy==1.2.7
urlgrabber==3.10
urllib3==1.24.1
virtualenv==15.1.0
Werkzeug==0.14.1
yum-metadata-parser==1.1.4

Теперь, потому что я подозреваю, что кто-то будет предлагать это, я просто собираюсь сейчас это исключить.У меня все эти пакеты установлены глобально для моего --user.Я НЕ пользуюсь виртуальной средой, да, я знаю, что должен, но я не думал, что она мне понадобится, потому что все работает на одном сервере.Да, я признаю, что это может быть ошибкой, и я использую их повсюду, но это не имеет значения, если бы я мог получить некоторую помощь с этой ошибкой, которая была бы великолепна.Он запускается на моей локальной машине и работает просто отлично, просто когда я пытаюсь запустить его на своем сервере, он не работает.

Наконец, если это связано с конфликтом с пакетами на моем сервере, было бы здорово, есликто-то может помочь мне разобраться, как их удалить, и я буду благодарен за инструкции, так как я использую AWS AMI Linux.

1 Ответ

0 голосов
/ 12 февраля 2019

Таким образом, с учетом деталей, указанных в вопросе, у нас есть сценарий, в котором скрипт Python и среда, в которой он будет выполняться, имеют:

  1. Зависимость от некоторых пакетов;
  2. Virtualenv не используется, но каталог установки пользователя Python (как пользователь ec2-user) используется вместо этого для простоты установки зависимостей сценария;
  3. Однако для запуска сценария требуются права суперпользователя (из-за использование нижних портов , с повышенным разрешением, полученным через sudo (как пользователь root).

Естественно, при выполнении сценария как root, в то время какзависимости были установлены локально для пользователя, отличного от root, что будет означать, что ни одна из зависимостей на самом деле не будет доступна этому сценарию. Поскольку зависимости установлены в site.USER_BASE для ec2-user, вЧтобы сценарий мог импортировать свою зависимость при выполнении под пользователем root, его местоположение можно определить с помощью PYTHONUSERBASEпеременная окружения.

Чтобы добиться этого при использовании sudo, попробуйте:

$ sudo PYTHONUSERBASE=/home/ec2-user/.local python MyCoolApp.py

Если это работает, отлично, мы можем перейти к более чистому подходу, если это необходимо, так как этот подход можетпотенциально может привести к ситуациям, когда пользователь ec2-user не сможет удалить файлы из своего каталога .local, поскольку такие файлы, как .pyc, будут записаны в него в качестве корня.

Можно сделать несколько подходов:

  1. Ленивый способ: sudo pip, устанавливать пакеты глобально;поставляется со всеми проблемами наличия глобально доступных пакетов Python.
  2. Используйте взамен sudo pip --user - только локально для пользователя root.
  3. Ряд подходов на уровне ОС, которыйДоступно в Linux:
  4. Используйте virtualenv и запустите скрипт Python (с sudo как root), используя env/bin/python, созданный virtualenv.Пример (использует /var/tmp/env в качестве базы для демонстрации):
$ virtualenv /var/tmp/env
Using base prefix '/usr'
New python executable in /var/tmp/env/bin/python3.6
Also creating executable in /var/tmp/env/bin/python
Installing setuptools, pip, wheel...done.
$ . /var/tmp/env/bin/activate
(env) $ pip install -r requirements.txt
...
(env) $ deactivate
$ sudo /var/tmp/env/bin/python MyCoolApp.py

Наконец, может быть полезно сбросить привилегии root обратно к исходному пользователю (или другому ограниченномуuser) после открытия порта, чтобы улучшить ситуацию безопасности среды выполнения.

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