【问题标题】:python script is not running without sudo - why?没有 sudo,python 脚本无法运行 - 为什么?
【发布时间】:2018-07-09 13:45:14
【问题描述】:

这是我的 python 脚本,它从我的 S3 存储桶中下载最新的图像。当我使用sudo python script.py 运行此脚本时,它按预期运行, 但不是当我以python script.py 运行它时。在这种情况下,脚本干净地完成,没有异常或进程锁定,但没有图像文件。

为什么会这样?有什么我可以在博托图书馆结束或其他任何事情上做的吗?

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()

【问题讨论】:

  • “不运行”应该是什么意思?为什么我还要一直问这个?
  • 你有异常吗?你得到一个零长度的文件吗?进程是否锁定?这是什么意思?
  • @Guru 使用此信息更新您的问题。
  • 您是否考虑过摆脱垃圾异常“处理”以便查看实际发生的情况?
  • 另外,你绝对不只是在 this 脚本上运行python script.py,因为它只是定义了一个函数而不调用它。请发布一个最小、完整且可验证的示例。

标签: python boto sudo


【解决方案1】:

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

【讨论】:

  • 这不应该是目录权限问题,我已经完成了chmod -R 777 加上这些不是我正在尝试的异常处理的实际 S3 身份验证密钥,但我怎么知道发生了哪个异常?我
  • 如果您没有捕捉到异常,它将中止脚本并产生堆栈跟踪。如果您想继续运行,在您的 except 块中调用 traceback.print_exc 将为您打印相同的回溯,但允许脚本继续。日志消息可以通过增加严重性(使用warning 而不是info)或configuring logging 来显示更详细。
【解决方案2】:

在开始使用 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。


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

【讨论】:

    【解决方案3】:

    因为 cmets 中的 @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 搜索此错误,您应该会发现 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] &gt; y[0]) - (x[0] &lt; y[0])cmp(x[0], y[0]) 的替代品

    cmpkey 替换,cmp_to_key 被 functools 使用 lib

    Check this out

    【讨论】:

    • 感谢它的工作。实际上我正在研究openCV lib所以安装了安装不同版本python的Anaconda
    • @Guru :在这种情况下,您需要为 Anaconda 安装 conda 以启用您的虚拟环境。因为conda install 下的许多软件包都不是最新的,所以对于那些不使用 Anaconda 的人来说,使用 condavirtualenv 并没有明显的优势。 kylepurdon.com/blog/…
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多