ImportError:在AWS EC2实例上没有名为boto3的模块

时间:2019-02-11 09:02:49

标签: python amazon-web-services boto3

我正在运行我的AWS EC2实例,当我尝试运行Web应用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 Frozen时,我可以看到它。这是下面的输出:

[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 :(得分:0)

因此,根据问题中提供的详细信息,我们有一个脚本和执行脚本的环境如下:

  1. 对某些软件包的依赖性;
  2. 不使用virtualenv,而是使用Python用户安装目录(作为ec2-user用户)来简化脚本依赖项的安装;
  3. 但是,脚本需要root特权才能运行(由于usage of low ports,并且通过sudo(作为root用户)获得了更高的权限。

很自然地,如果在root以外的用户本地安装依赖项时以root身份运行脚本,则意味着该脚本实际上无法访问任何依赖项。由于依赖项安装在ec2-user的{​​{3}}下,为了使脚本能够在root用户下执行时导入其依赖项,可以使用以下命令定义位置site.USER_BASE环境变量。

要在使用sudo时实现这一点,请尝试:

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

如果行得通,那就太好了,如果需要的话,我们可以采用更清洁的方法,因为这种方法可能会导致ec2-user用户无法从其.local目录中删除文件的情况像.pyc这样的文件将作为根写入那里。

可以采用多种方法:

  1. 最懒的方式:sudo pip,在全局安装软件包;带有拥有全球可用的python软件包的所有问题。
  2. 改为使用sudo pip --user-仅在root用户本地。
  3. PYTHONUSERBASE
  4. 使用virtualenv,并使用由virtualenv创建的sudo启动Python脚本(以root作为env/bin/python)。示例(使用/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

最后,打开端口后,A number of approaches at the OS level that is available on Linux may be attempted(或另一个受限用户)可能会有所帮助,以改善运行时环境的安全状况。