这是我的python脚本,它从我的S3存储桶中下载最新的图像。当我使用sudo python script.py
运行此脚本时,它按预期运行
但是当我以python script.py
运行时却没有。在这种情况下,脚本干净地完成,没有异常或进程锁定,但没有图像文件。
为什么会这样?我可以在boto的图书馆端或其他任何事情上做些什么吗?
import boto
import logging
def s3_download():
bucket_name = 'cloudadic'
conn = boto.connect_s3('XXXXXX', 'YYYYYYY')
bucket = conn.get_bucket(bucket_name)
for key in bucket.list('ocr/uploads'):
try:
l = [(k.last_modified, k) for k in bucket]
key = sorted(l, cmp=lambda x, y: cmp(x[0], y[0]))[-1][1]
res = key.get_contents_to_filename(key.name)
except:
logging.info(key.name + ":" + "FAILED")
if __name__ == "__main__":
s3_download()
答案 0 :(得分:1)
据推测,问题在于您尝试将内容存储在用户无权访问的位置。第二个问题是您的脚本隐藏了错误。 except
块完全忽略了发生什么类型的异常(当然消耗它们以便您永远不会看到它们),并使用默认情况下未显示的logging.info
;这应该至少是一个警告,如果它显示出了什么问题会更好。顺便说一句,你不应该在这里发布S3身份验证密钥。
答案 1 :(得分:1)
由于评论中的@Nearoo建议使用except Exception as inst
来捕获异常。
像这样抓住异常
except Exception as inst:
print(type(inst))
print(inst.args)
print(inst)
如果使用python 3x编译脚本,是否应该获取此错误 如果你使用python 2.7编译你的脚本,那么这个错误就不会发生。
您的系统上可能有多个版本的python,
这应该是您在python script.py
和sudo python script.py
的行为上有所不同的原因,对于相同的@mootmoot回答建议使用virtualenv
'cmp' is an invalid keyword argument for this function
。
现在,如果您使用Google搜索此错误,您应该会发现python 3x中已弃用cmp
,建议改为使用key
。
添加这些导入
import functools
from functools import cmp_to_key
并替换 用这些
key2 = sorted(l, key = cmp_to_key(lambda x,y: (x[0] > y[0]) - (x[0] < y[0])))[-1][1]
res = key2.get_contents_to_filename(key2.name)
(x[0] > y[0]) - (x[0] < y[0])
是cmp(x[0], y[0])
cmp
已替换为key
,而cmp_to_key
则来自functools lib
答案 2 :(得分:0)
在python中开始开发之前,请始终安装virtual environment。
您遇到的问题是典型的python新手问题:使用sudo
安装所有pypi包。
执行sudo pip install boto3
时,它会将pypi软件包安装到系统工作区,并且只能由sudo
访问。在这种情况下,sudo python script.py
将起作用,因为它有权访问包。
要解决这个问题并隔离开发环境(所以你不要用不同的pypi包污染不同的项目),python开发人员将安装python虚拟环境(从上面的链接),然后使用mkvirtualenv
来创建你的项目工作区,运行pip install
和python setup.py install
以向环境安装所需的包,然后您可以在不使用sudo python
的情况下运行python。
出于同样的原因,Python virtualenv也部署在生产环境中。
重要提示:避免使用boto和boto2。 AWS不再支持它们,也不再修复错误(AWS不是正式支持boto2,使用它需要您自担风险)。切换到boto3。
对于特殊处理问题,@ Yan Vernier已经提到过。 logging.info
不会记录异常错误。您可以尝试使用logging.debug
或简单地使用raise
来引发实际的异常错误。