繁体   English   中英

没有sudo,python脚本无法运行-为什么?

[英]python script is not running without sudo - why?

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

大概的问题是您试图将内容存储在用户没有权限的地方。 第二个问题是您的脚本隐藏了错误。 except块完全忽略了发生哪种异常(当然会消耗掉它们,因此您永远不会看到它们),并使用logging.info ,默认情况下它不会显示; 这可能至少应该是一个警告,并且如果它显示出什么地方出了问题,将会更好。 顺便说一句,您不应该在这里发布S3身份验证密钥。

正如@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

现在,如果您已经用谷歌搜索了此错误,则应该发现cmp在python 3x中已被弃用,建议使用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])的替代

使用key替换cmp ,并使用functools lib cmp_to_key

看一下这个

在开始使用python开发之前,请务必先安装虚拟环境

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

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

为了解决此问题并隔离开发环境(因此,您不会使用不同的pypi包污染其他项目),python开发人员将安装python虚拟环境(通过上面的链接),然后使用mkvirtualenv创建项目工作区,运行pip installpython setup.py install可以将所需的软件包python setup.py install到环境中,然后无需sudo python即可运行sudo python

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

重要说明 :避免使用boto和boto2。 AWS不再支持它们,也不再提供错误修复(AWS尚未正式支持boto2,使用后果自负)。 切换到boto3。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM