使用BOTO进行S3各种操作

2023-11-05

BOTO是一个开源的PYTHON发布包,是AWS(AMAZON WEBSERVICE)的PYTHON封装。

近期,我们公司用到国内某知名公司的S3云存储服务,需要调用该公司提供的S3 PYTHON SDK。鉴于该公司没有PYTHON版本的SDK,所以我决定利用开源的BOTO的S3模块稍加改进。在经过easy_install boto之后便开始了BOTO的封装

以下是我最开始封装的代码模型


1)获取S3连接:


 

Python代码   收藏代码
  1. <span style="font-size: medium;">from boto.s3.connection import S3Connection  
  2. conn = S3Connection(S3_ACCESSED_ID, S3_SECRECT_ACCESS_KEY,host=S3_HOST)</span>  

 


参数说明:

   S3_HOST是提供开放式云存储服务的公司提供的云主机域名

   S3_ACCESSED_ID, S3_SECRECT_ACCESS_KEY是该公司提供给我们公司的唯一访问标识


2)PUT上传文件

 

Python代码   收藏代码
  1. <span style="font-size: medium;"def put(bucket_name, s3_path, local_file):   
  2.        b = conn.get_bucket(bucket_name)  
  3.        k = Key(b)  
  4.        k.key = s3_path  
  5.        k.set_contents_from_filename(local_file,policy='public-read')</span>  

  参数说明:

         bucket_name是云主机上的云储存分类标识,类型是字符串,可以说是云储存的第一层目录,比如你们公司可以有mp3,mp4,wma等N个一层目录,也就是所谓的bucket,这个可以通过代码创建,也可以登录到云储存网页的控制台进行手动操作

         local_file指的是你要上传的文件,类型是字符串,就是文件绝对路径

         s3_path就是文件上传到s3后要在s3上生成的目录结构,上传时会在指定的bucket下生成该多级目录,当然目录的结尾肯定是文件名


3)get下载文件

 

Python代码   收藏代码
  1. <span style="font-size: medium;">def get(bucket_name,s3_path,local_file):  
  2.     b = conn.get_bucket(bucket_name)  
  3.     key = b.lookup(s3_path)  
  4.     key.get_contents_to_filename(local_file)  
  5. </span>  

 该方法的参数与put方法中的解释类似


这些代码如果在普通的机器上测试的话,会发现没有任何问题,包括上传下载删除之类的操作都能够成功进行。实际开发过程我发现,将这些代码部署到提供云存储的一套云虚拟机环境中,所有的代码都会执行失败。这个过程中,经历了千辛万苦,我还是没有发现个中原因,主要是在云虚拟机环境中创建conn连接是成功的,就是执行到conn.get_bucket(bucket_name)这一步始终通不过,我考虑到是否在get_bucket加入headers认证什么的,后来研究源码发现没有什么可以加入的,经历了两天的苦苦挣扎(这期间,我考虑过放弃BOTO,而封装使用该公司非常复杂难以理解的REST接口,后来发现,他们的REST接口在本地机器更是一个操作都执行不成功,更别说是虚拟机环境,到了周末陷入了两难的境地,开源的封装了搞不好,他们REST封装了也搞不好。)我还是选择重新研究这个报错的信息

 

Python代码   收藏代码
  1. <span style="font-size: medium;">Traceback (most recent call last):  
  2.   File "s3tester.py", line 35in <module>  
  3.     main()  
  4.   File "s3tester.py", line 22in main  
  5.     s3.get_bucket()  
  6.   File "/srv/store/20120913111600/common/file/huaweiyun.py", line 77in get_bucket  
  7.     b = conn.get_bucket('vodmedia', validate=True)  
  8.   File "/usr/local/lib/python2.6/dist-packages/boto-2.5.2-py2.6.egg/boto/s3/connection.py", line 391in get_bucket  
  9.     bucket.get_all_keys(headers, maxkeys=0)  
  10.   File "/usr/local/lib/python2.6/dist-packages/boto-2.5.2-py2.6.egg/boto/s3/bucket.py", line 360in get_all_keys  
  11.     '', headers, **params)  
  12.   File "/usr/local/lib/python2.6/dist-packages/boto-2.5.2-py2.6.egg/boto/s3/bucket.py", line 317in _get_all  
  13.     query_args=s)  
  14.   File "/usr/local/lib/python2.6/dist-packages/boto-2.5.2-py2.6.egg/boto/s3/connection.py", line 470in make_request  
  15.     override_num_retries=override_num_retries)  
  16.   File "/usr/local/lib/python2.6/dist-packages/boto-2.5.2-py2.6.egg/boto/connection.py", line 913in make_request  
  17.     return self._mexe(http_request, sender, override_num_retries)  
  18.   File "/usr/local/lib/python2.6/dist-packages/boto-2.5.2-py2.6.egg/boto/connection.py", line 859in _mexe  
  19.     raise e  
  20. socket.gaierror: [Errno -2] Name or service not known</span>  

 后来,在始终不愿放弃的情况下艰难搜索,终于发现解决方案

 具体是一下两个网上的建议给了我帮助:

http://www.somic.org/2010/11/16/connecting-to-eucalyptus-walrus-s3-with-boto-and-socket-gaierror/

http://www.eucalyptus.com/eucalyptus-cloud/tools/boto


后来遵照他们的说法,我折腾了两天没发现原因的地方,仅仅因为一个小小的配置就成功了。

那就是创建连接是多加入一个参数:calling_format=calling_format

具体代码为:

 

Python代码   收藏代码
  1. <span style="font-size: medium;">from boto.s3.connection import S3Connection,OrdinaryCallingFormat  
  2. calling_format=OrdinaryCallingFormat()  
  3. conn = S3Connection(S3_ACCESSED_ID, S3_SECRECT_ACCESS_KEY,host=S3_HOST,calling_format=calling_format)</span>  

 将这段代码改进之后,虚拟机上的一套都能够测试通过,包括最需要的上传下载操作,事实证明遇到难题,千万不要放弃,一定要寻找到答案为止。

    这个代码改进的成功也打消了我对该公司云存储虚拟机的误解:之前我的代码在普通机器上执行完全正常的情况下到了他们虚拟上就执行失败,我当时非常怀疑是他们的虚拟机做了什么特殊的配置限定了代码访问云主机,后来跟他们的技术交流他们说没有任何特殊配置,可是我还是心存怀疑。直到今天发现问题所在,看来我是误解他们了!抱歉。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用BOTO进行S3各种操作 的相关文章

  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • docker 非 root 绑定安装权限,WITH --userns-remap

    all 尝试让绑定安装权限正常工作 我的目标是在容器中绑定安装卷 以便 a 容器不以 root 用户身份运行入口点 二 docker daemon 配置了 userns remap 这样容器 主机上没有 root c 我可以绑定挂载和读 写
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐

  • 【SpringBoot】还不会SpringBoot项目模块分层?来这手把手教你

    文章目录 前言 缘由 本文阅读时长 主要目标 试用人群 快速链接 水图 正文 1 IDEA新建项目 2 创建子模块 dependencies 依赖层 重点 3 创建子模块 main 主启动层 重点 4 创建子模块 module 模块层 5
  • Eclipse关于搭建JSP运行环境(超级详细过程附带网页地址)

    1 下载jdk 2 配置环境变量 3 下载安装Tomcat 4 下载安装Eclipse 5 配置Eclipse运行第一个JSP程序 一 下载jdk 百度地址栏搜索https www oracle com java technologies
  • js替换字符串中的空格,换行符\r\n或\n替换成

    为了让回车换行符正确显示 需要将 n 或 r n 替换成 br 同样地 将空格替换存 nbsp 这里我们通过正则表达式来替换 一 替换所有的空格 回车换行符 原始字符串 var string 欢迎访问 r nhangge com 做最好的开
  • Linux_8_磁盘存储和文件系统

    1 磁盘结构 1 1 设备文件 一切皆文件 open read write close 设备文件 关联至一个设备驱动程序 进而能够跟与之对应硬件设备进行通信 设备号码 主设备号 major number 标识设备类型 次设备号 minor
  • A*寻路算法浅析

    最近刚接触A 寻路算法 听说是一种比较高效的自动寻路的算法 当然 事实也正是如此 这么好的东西 自然是要收入囊中的 说不定什么时候也能派上用场呢 为了学习这个 也是上网找了好多资料 看了好多博客 但是貌似有些关键点没有具体说明 所以自己也是
  • understand - 笔记

    术语 Terminology Architecture 层级 An architecture is a hierarchical aggregation of source code units entities An architectu
  • 用vb语言编写一个抄底的源代码程序实例

    以下是一个基于通达信软件编写的简单抄底源代码程序 用于自动识别股票的底部形态并发出买入信号 vbs 复制 导入通达信软件自带的股票数据接口 Dim TdxApi Set TdxApi CreateObject TdxApi TdxLocal
  • Winform自定义控件 —— 指示灯

    在开始阅读本文之前 如果您有学习创建自定义控件库并在其他项目中引用的需求 请参考 在Visual Studio中创建自定义Winform控件库并在其他解决方案中引用https blog csdn net YMGogre article de
  • Rx Java 异步编程框架

    Rx Java 文章目录 Rx Java 名词定义 举个例子 基本概念 Backpressure Upstream Downstream Objects in motion Assembly time Subscription time R
  • Cocos2d-x使用Luajit将Lua脚本编译为bytecode,从而实现加密

    项目要求对lua脚本进行加密 查了一下相关的资料 得知lua本身可以使用luac将脚本编译为字节码 bytecode 从而实现加密 试了一下 确实可行 下面是使用原生的lua解释器编译字节码 1 新建一个名为1 lua的文件 里面只有一句话
  • 带宽与码元的关系_带宽、速率(波特率、比特率)和码元宽度简述

    首先弄清楚带宽和速率的关系 信道带宽与数据传输速率的关系可以奈奎斯特 Nyquist 准则与香农 Shanon 定律描述 奈奎斯特准则指出 如果间隔为 2 f 通过理想通信信道传输窄脉冲信号 则前后码元之间不产生相互窜扰 因此 对于二进制数
  • 【云原生之Docker实战】使用Docker部署web端vscode

    云原生之Docker实战 使用Docker部署web端vscode 一 vscode server介绍 二 检查本地docke环境 1 检查系统版本 2 检查docker版本 3 检查docker状态 三 下载vscode镜像 四 部署vs
  • 北京理工大学:《Python语言程序设计》详细笔记

    第一章 程序设计基本方法 计算机与程序设计 计算机是根据指令操作数据的设备 计算机发展参照摩尔定律 表现为指数形式 编译和解释 计算机执行源程序两种方式 编译和解释 编译 将源代码一次性转换成目标代码的过程 执行编译过程的程序叫编译器 co
  • C#是不是不能把基类对象强转成它派生类对象

    转载请标明是引用于 http blog csdn net chenyujing1234 有补充的 请大家指出 最近在论坛上看到有网友问到C 中对象强转的问题 自己虽然接触过C 但对这个特性还是第一次接触 所以这里找到一些资料与大家一起分享
  • unity 模仿原神的人物移动和镜头变换

    unity 模仿原神人物移动和镜头转换 自学了几周unity了 感觉还是要做点什么上手才快 所以先做个简单的RPG游戏吧 然后很快就做出了CS那种第一人称视觉的人物操控 不过感觉体验不太好 不能边走边看周围 所以重新模仿了原神那种可以环绕人
  • 3D建模教程分享

    全套3D建模教程让你从小白到大神 工欲善其事必先利其器 目前主流的3D建模软件当然是3DMAX MAYA还有ZBrush了 开始学习之路前这三个软件肯定是必备的 欢迎大家加入Q裙 939901947 领取各种学习资料和软件 迈出成为大神的第
  • linux系统创建新用户

    一般情况下linux系统创建 删除新用户主要有以下几种方式 1 创建新用户 useradd 用户名 删除用户 userdel 用户名 2 sudo useradd m 用户名 删除用户 sudo userdel r 用户名 可以直接删掉用户
  • 联想笔记本插入耳机仍外放--解决方式

    1 打开控制面板 2 点击硬件和声音 3 点击realtek音频管理器 4 点击设备高级设置 5 选中第二项 6 点击确定 关闭所有窗口即可解决该问题
  • 数学在机器学习中的重要性

    数学在机器学习中的重要性 by Dahua Lin Linear Algebra 线性代数 和 Statistics 统计学 是最重要和不可缺少的 这代表了Machine Learning中最主流的两大类方法的基础 一种是以研究函数和变换为
  • 使用BOTO进行S3各种操作

    使用BOTO进行S3各种操作 BOTO是一个开源的PYTHON发布包 是AWS AMAZON WEBSERVICE 的PYTHON封装 近期 我们公司用到国内某知名公司的S3云存储服务 需要调用该公司提供的S3 PYTHON SDK 鉴于该