AWS Elastic Beanstalk未使用我的虚拟环境:“没有名为boto的模块”
我正在尝试使用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.txt
、git add requirements.txt
和 git commit -m 'Added boto to requirements.txt'
,这些都成功了。
然后我进入了Python的命令行,成功导入了boto,没有出现任何错误。
最后,我再次在普通命令行中运行 eb start
,结果还是出现了“没有名为boto的模块”的错误。
看起来 eb start
命令没有使用我的虚拟环境。我该怎么办呢?
2 个回答
我遇到过类似的问题,使用 eb push 的时候。问题在于 eb 在推送内容到 AWS 的过程中会用到 git(也就是 git aws.push)。你可以在你的代码库目录下的 ".git/AWSDevTools/" 找到相关的脚本。
当 git 运行时,它会修改一个叫做 $PATH 的环境变量,并把 "/usr/libexec/git-core:/usr/bin" 加到 $PATH 的最前面。这就导致 AWS 的脚本使用的是 /usr/bin/python,而不是虚拟环境中的 python,因为虚拟环境里没有安装 boto 这个库。
我通过在 AWS 脚本上加了一个包装器来解决这个问题,这个包装器会检查是否启用了虚拟环境,并且修正 $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 的别名调用这个包装器。
[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
好吧,这个方法有点黑科技,而且看起来不太好,但它确实有效。
现在,错误发生在本地机器上,和远程没有关系。
我在本地安装了boto,并且没有使用虚拟环境(出于我自己的原因,我想测试一种更简单的方法)。
1 注意错误发生的位置 - 在 .git/AWSDevTools/aws/dev_tools.py
2 运行一个非虚拟环境的Python,然后
导入boto 打印boto.file /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/boto/init.pyc
3 打开那个dev_tools.py文件,并在顶部添加以下内容:
导入sys 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,你会发现你的这个黑科技也在那里。
虽然不太完美,但确实有效。
附言:抱歉格式不太好,我是新手,现在很晚了,我想去滑冰。