没有sudo的python脚本没有运行 - 为什么?

时间:2016-10-14 10:29:17

标签: python boto sudo

这是我的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()

3 个答案:

答案 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.pysudo 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

Check this out

答案 2 :(得分:0)

在python中开始开发之前,请始终安装virtual environment

您遇到的问题是典型的python新手问题:使用sudo安装所有pypi包。

执行sudo pip install boto3时,它会将pypi软件包安装到系统工作区,并且只能由sudo访问。在这种情况下,sudo python script.py将起作用,因为它有权访问包。

要解决这个问题并隔离开发环境(所以你不要用不同的pypi包污染不同的项目),python开发人员将安装python虚拟环境(从上面的链接),然后使用mkvirtualenv来创建你的项目工作区,运行pip installpython setup.py install以向环境安装所需的包,然后您可以在不使用sudo python的情况下运行python。

出于同样的原因,Python virtualenv也部署在生产环境中。

重要提示:避免使用boto和boto2。 AWS不再支持它们,也不再修复错误(AWS不是正式支持boto2,使用它需要您自担风险)。切换到boto3。

对于特殊处理问题,@ Yan Vernier已经提到过。 logging.info不会记录异常错误。您可以尝试使用logging.debug或简单地使用raise来引发实际的异常错误。