本文介绍使用 OSS Python SDK 的常见问题及解决方法。

OSS Python SDK 分片上传失败

用户使用 Python SDK 分片上传函数,上传数据到 OSS失败,且出现很多文件碎片。

  • 解决方法
    • 先确认是直接上传到 OSS,还是通过其他 proxy 传输到 OSS (类似 CDN)。如果经过 CDN 再上传到 OSS,需要在 OSS 中配置跨域的 HTTP header,Access-Control-Allow-Origin 、Access-Control-Allow-Mehtods、Access-Control-Allow-Headers,并且将 Etag 暴露出去,详情请参考PutBucketcors
    • 如果是网络超时导致上传失败,建议使用断点续传来替代普通上传。断点续传支持并行上传、自定义分片大小。如果捕获到异常,需要详细查看并分析捕获到的 SDK 异常信息。
    • 清理上传失败的碎片文件再重新上传。
    如果以上方案仍旧没有解决您的问题,需要将以下信息提供给阿里云:
    • SDK 返回异常中的 requestID。
    • 客户端部署 tcpdump ,然后重新运行代码上传,并保存抓包。
      tcpdump -i <网卡出口名称> -s0 host <访问oss的域名> -w faild.pcap

同台机器使用 ossutil 上传下载很快,而使用 Python SDK 上传下载很慢

ossutil 使用 Go 语言开发 ,并发上传的性能较好。如果使用 Python SDK 上传、下载时性能远不如 ossutil,通常是因为没有正确安装 crcmod 。有关 crcmod 的更多详情,请参考 Python SDK 安装。如仍未能解决您的问题,请提交工单

在 Centos 机器上调用 SDK 中的分片上传函数正常,但在 ubuntu 机器上总是报 403 错误。

  • 解决方法
    • 客户端部署 tcpdump 抓包,可以通过 tcp 报文排查是否由于 Header 信息不正确导致计算签名与服务端不匹配。
      POST /ttsservice%2Fpasswd?uploadId=D468E486D1D94D90A1AB8885A4E32AE0 HTTP/1.1
      Host: rokid.oss-cn-hangzhou.aliyuncs.com
      Accept-Encoding: identity
      Accept: */*
      Content-Length: 137
      date: Sat, 29 Dec 2018 07:32:34 GMT
      authorization: OSS LTAIknFr:r2KPR0y4E0G5tnU/MYdcvXHPQQ4=
      Content-Type: application/x-www-form-urlencoded
      User-Agent: aliyun-sdk-python/2.6.0(Linux/4.4.0-31-generic/x86_64;3.4.3)
      
      <CompleteMultipartUpload><Part><PartNumber>1</PartNumber><ETag>"3195544E19D99658706D51EF5"</ETag></Part></CompleteMultipartUpload>HTTP/1.1 403 Forbidden
      
      Server: AliyunOSS
      Date: Sat, 29 Dec 2018 07:33:43 GMT
      Content-Type: application/xml
      Content-Length: 1122
      Connection: keep-alive
      x-oss-request-id: 5C2723573183A12D
      x-oss-server-time: 0
      
      <?xml version="1.0" encoding="UTF-8"?>
      <Error>
       <Code>SignatureDoesNotMatch</Code>
       <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
       <RequestId> 5C2723573183A12D </RequestId>
       <HostId>rokid.oss-cn-hangzhou.aliyuncs.com</HostId>
       <OSSAccessKeyId> LTAXXX </OSSAccessKeyId>
       <SignatureProvided>r2KPR0y4E0G5tnU/MYdcvXHPQQ4=</SignatureProvided>
       <StringToSign>POST
      application/x-www-form-urlencoded
      Sat, 29 Dec 2018 07:32:34 GMT
      /rokid/ttsservice/passwd?uploadId=D468E486D1D94D90A1AB8885A4E32AE0</StringToSign>
       <StringToSignBytes>50 4F 53 54 0A 0A 61 70 70 6C 69 63 61 74 69 6F 6E 2F 78 2D 77 77 77 2D 66 6F 72 6D 2D 75 72 6C 65 6E 63 6F 64 65 64 0A 53 61 74 2C 20 32 39 20 44 65 63 20 32 30 31 38 20 30 37 3A 33 32 3A 33 34 20 47 4D 54 0A 2F 72 6F 6B 69 64 2D 6F 70 73 2D 6D 6F 64 65 6C 2F 74 74 73 73 65 72 76 69 63 65 2F 70 61 73 73 77 64 3F 75 70 6C 6F 61 64 49 64 3D 44 34 36 38 45 34 38 36 44 31 44 39 34 44 39 30 41 31 41 42 38 38 38 35 41 34 45 33 32 41 45 30 </StringToSignBytes>
      </Error>
      以上是客户端抓到的报文信息。请将获取的请求头信息带入以下脚本,并比较计算结果是否和 SDK 一致。
      import base64
      import hmac
      import sha
      mac = hmac.new("<Secretkey>","POST\n\napplication/x-www-form-urlencoded\nSat, 29 Dec 2018 07:32:34 GMT\n/rokid/ttsservice/passwd?uploadId=D468E486D1D94D90A1AB8885A4E32AE0", sha)
      Signature = base64.b64encode(mac.digest())
      print(Signature)
      • 如果抓包数据和脚本计算的结果一致,则说明 SDK 计算正确。如果抓包数据和脚本计算的结果不一致,可能是因为 SDK 在 ubuntu 平台编译的适配问题导致 MD5 值不一样。
      • 如果服务端收到的 signature 和客户端计算的 signature 不一致,说明请求的内容已经被改动过,建议使用 https 的方式上传。

在 Mac 环境中用 Python 启动多线程并在子线程中使用 OSS 时,import tensorflow 会报错,没有 import tensorflow 则不会报错。如果没有启动多线程,使用 OSS 时 import tensorflow 不会报错。

Python 多线程运行时,报如下错误:
objc[2483]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called.
objc[2483]: +[__NSPlaceholderDate initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.

其他错误

有关安装过程中遇到的问题排查,请参见 Python SDK 安装文档。