[英]Why is the PYTHONPATH different when running Python with and without sudo?
[英]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.py
和sudo 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 install
和python 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.