python之后转换为exeocore.exceptions.DataNotFoundError

时间:2015-09-24 14:53:28

标签: python amazon-s3 py2exe boto3

我可以在Windows上使用python 2.7解释器上传数据而没有任何问题。 但是在我将它编译为exe之后,它在行显示错误: If str2 <> "" Then If str2 = "A" Then 'set UDF3 as the value B Set objProperty = msg.UserProperties.Add(list(3), olKeywords) else Set objProperty = msg.UserProperties(udf(2)) end if end if If (objProperty Is Nothing) Then Set objProperty = msg.UserProperties.Add(udf(2), olKeywords) End If

s3 = session.client('s3')

错误是:

import HTMLParser
import ConfigParser
# Above packages necessary because boto3 depend on them
import boto3
from boto3.session import Session
# variable initialization
session = boto3.session.Session()
s3 = session.client('s3') #Error at this line
s3.upload_file(fileToUpload, bucketName, keyName)

可能是什么问题?

2 个答案:

答案 0 :(得分:3)

这是因为boto3无法找到其数据文件。

在这种情况下, Python27 \ Lib \ site-packages \ botocore \ data 包含数据文件。我们需要指示boto3在我们的主模块所在的同一目录中的数据文件夹中搜索它们。然后我们需要让py2exe捆绑引用的包,并使用EXE捆绑数据文件。

提供数据文件

copy C:\Python27\Lib\site-packages\botocore\data  <project_root>\data
xcopy /s /i C:\Python27\Lib\site-packages\botocore\data\s3  <project_root>\data\s3

提供cacert.pem

copy C:\Python27\Lib\site-packages\botocore\vendored\requests\cacert.pem <project_root>\data

然后重新编写我的代码:

import boto3
from boto3.session import Session

CACERT = 'data/cacert.pem'
session = boto3.session.Session()
session._loader.search_paths.append('data') # boto3 will search for data files in the 'data' folder within current directory
s3 = session.client('s3', use_ssl=True, verify=CACERT) # cacert.pem will be used for SSL
s3.upload_file(fileToUpload, bucketName, keyName)

现在我的python模块使用<project_root>\data内的资源而不是C:\Python27\Lib\site-packages\botocore\data

最后,setup.py指示py2exe将所有数据文件和引用的包包含在分发中。

from distutils.core import setup
import py2exe

aws_data_files = [
                    ('data', ['data/_endpoints.json','data/_retry.json', 'data/cacert.pem']),
                    ('data/s3/2006-03-01', ['data/s3/2006-03-01/service-2.json'])
                 ]
setup(
        options = {
            'py2exe': {
                'bundle_files': 1,
                'compressed': True,
                'dll_excludes':['w9xpopen.exe','crypt32.dll'],
                'packages': ['HTMLParser', 'ConfigParser', 'boto3.s3.inject'],
                }
            },
        console=['myProg.py'],
        zipfile = None,
        data_files = aws_data_files,
    )

通过issuejamesls,可以从此rayluo中提取答案。

答案 1 :(得分:-1)

我回答了我自己的问题。

通过在aws文件中添加以下内容

(&#39; data / s3 / 2006-03-01&#39;,[&#39; data / s3 / 2006-03-01 / paginators-1.json&#39;]) (&#39; data / s3 / 2006-03-01&#39;,[&#39; data / s3 / 2006-03-01 / waiters-2.json&#39;])

现在按预期工作。