AWS 的 Elastic Beanstalk 未使用我的 virtualenv:“没有名为 boto 的模块”

Posted

技术标签:

【中文标题】AWS 的 Elastic Beanstalk 未使用我的 virtualenv:“没有名为 boto 的模块”【英文标题】:AWS's Elastic Beanstalk not using my virtualenv: "No module named boto" 【发布时间】:2014-06-14 18:51:44 【问题描述】:

我正在尝试使用 AWS 的 Elastic Beanstalk,但是当我运行 eb start 时,我收到“ImportError: No module named boto Cannot run aws.push for local repository HEAD。”

我在我的 Django 项目的虚拟环境中。 我跑了pip install boto,它成功了。 我做了pip freeze > requirements.txtgit add requirements.txtgit commit -m 'Added boto to requirements.txt',都成功了。 然后我进入python shell并导入boto,没有任何错误。 最后,我再次在普通命令行上运行eb start。同样的“没有名为 boto 的模块”错误。

似乎 eb start 命令没有使用我的 virtualenv。我该怎么办?

【问题讨论】:

嗨 Michelle,我有完全相同的问题 ***.com/questions/23365374/… 如果您找到解决方案,请告诉我。谢谢! 【参考方案1】:

好的,这是一个 hack,而且很丑陋,但它确实有效。

现在,错误发生在本地机器上,与远程无关。

我已经在本地安装了 boto,但我没有使用 virtualenv(出于我自己的原因,为了测试更准系统的方法)。

1 注意错误发生的位置 - 在 .git/AWSDevTools/aws/dev_tools.py 中

2 运行非virtualenv python 和

进口博托 打印 boto.文件 /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/boto/init.pyc

3 打开 dev_tools.py 并将其添加到顶部:

导入系统 sys.path.append("/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages")

由于您要附加到 sys.path,如果 git aws.push 没有在它自己的东西中找到它,您只会从该添加中导入模块。

这暂时解决了这个问题,只是它会在您执行“eb init”的下一个目录中再次出现

4 转到解压缩 CLI 的位置。就我而言:

$cd ~/bin/AWS-ElasticBeanstalk-CLI-2.6.1

现在

5 寻找eb init使用的dev_tools.py原件

$find ~/bin -name dev_tools.py ~/bin/AWS-ElasticBeanstalk-CLI-2.6.1/AWSDevTools/Linux/scripts/aws/dev_tools.py

按照 #3 编辑此文件

如果你在别处再做一次 eb init,你会发现你丑陋的 hack 也在那里。

不是很好,但它有效。

附言抱歉,这里的新手,已经很晚了,我想去滑冰。

【讨论】:

【参考方案2】:

我在使用 eb push 时遇到了类似的问题。问题是 eb 在将内容推送到 AWS (git aws.push) 的过程中使用 git。您可以在存储库目录的“.git/AWSDevTools/”中找到脚本。

当 git 运行时,它会修改环境变量 $PATH 并将“/usr/libexec/git-core:/usr/bin”附加到 $PATH 的开头。这使得 AWS 脚本使用 /usr/bin/python 而不是 virtualenv 上的 python,它没有安装 boto。

我通过在 AWS 脚本之上添加一个包装器来解决此问题,该包装器验证是否启用了 virtualenv 并更正了 $PATH 变量。

.git/AWSDevTools/pre.aws.elasticbeanstalk.push

#!/bin/bash

if [ -n $VIRTUAL_ENV ]; then
    PATH=$VIRTUAL_ENV/bin:$PATH
fi

DIR=$( cd "$( dirname "$BASH_SOURCE[0]" )" && pwd )
python $DIR/aws.elasticbeanstalk.push

然后修改.git/config文件,让aws.push别名调用wrapper

[alias "pre.aws.elasticbeanstalk"]  
    push = !.git/AWSDevTools/pre.aws.elasticbeanstalk.push

[alias "aws"]
    push = !git pre.aws.elasticbeanstalk.push  #Modified this line to call the wrapper

【讨论】:

以上是关于AWS 的 Elastic Beanstalk 未使用我的 virtualenv:“没有名为 boto 的模块”的主要内容,如果未能解决你的问题,请参考以下文章

AWS 的 Elastic Beanstalk 未使用我的 virtualenv:“没有名为 boto 的模块”

在 AWS Elastic Beanstalk 上设置 Django:未找到 WSGIPath

AWS Elastic Beanstalk Docker 来自 ECR 错误“Dockerrun.aws.json 中未指定 Docker 映像”

Django AWS RDS 环境变量未在 Elastic Beanstalk 中设置

AWS Elastic Beanstalk 和 Route 53 域链接 - “未找到 DNS”

AWS Elastic Beanstalk 上的 Django 1.7 - 应用程序未运行,仅看到“索引 /”