如何编译使用boto来访问S3的Python代码?

2024-04-25 18:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编译一个简单的Python程序,它使用boto包将文件上载到S3 bucket中,并将文件上载到一个单独的、可再发行的.exe文件中。我愿意接受任何编译方法。到目前为止,我已经尝试了bbfreeze和{},结果都一样。引起问题的代码如下所示:

import boto
#...snip...
fname_base = os.path.basename(fname)
s3 = boto.connect_s3(aws_access_key_id=_aws_key, aws_secret_access_key=_aws_secret_key, is_secure=False);
bucket = s3.get_bucket(_bucket)
key = bucket.new_key(fname_base)
key.set_contents_from_filename(fname)

使用可执行捆绑实用程序编译并运行我得到:

^{pr2}$

我在WindowsXPSP3上使用ActiveState Python2.6。boto软件包安装有:

easy_installer --always-unzip boto

我使用了--always-unzip选项,该选项基于found here关于py2exe与已解包的egg文件有关的信息。不幸的是,当我使用bb-freeze构建可执行文件时,我得到的错误是相同的。在

py2exe的输出在结尾处包含以下信息:

The following modules appear to be missing
['_scproxy', 'email.Encoders', 'email.MIMEBase', 'email.MIMEMultipart', 'email.MIMEText', 'email.Utils', 'simplejson']

这给了我们一些提示。我尝试了其他帖子中建议的方法,其中建议在使用py2exe编译时使用-i选项,但不幸的是没有任何帮助。在其他的问题中,用户正在做他们自己的显式包含电子邮件子模块。不幸的是,我不知道如何使这些解决方案适应我的情况,而且仅仅添加-i并没有阻止{}警告我缺少模块,或者生成的捆绑exe因缺少模块错误而失败。在

有人能帮我把这些代码捆绑起来重新分发吗?在


Tags: 模块文件方法key代码awsbases3
3条回答

我知道这是一个老问题,但我也遇到了同样的问题,并在仍然使用py2exe和py2app时修复了它。只需使用'packages'选项而不是'includes'选项设置.py公司名称:

extra = {}
mainscript = "foo/__main__.py"

if is_os_x():
    extra["setup_requires"] =['py2app']
    extra["app"] = [mainscript]
    extra["options"] = { "py2app": {
        "packages": ['email'],
        }                                       
    }

elif is_windows():
    extra["setup_requires"] =['py2exe']
    extra['console'] = [mainscript]
    extra['options'] = {'py2exe': {
        # Includes that py2exe doesn't include automatically
       'packages': ['email'],
       }
    }

setup(
    # snip
    ** extra
)   

希望有帮助。在

我真的让这个起作用了。答案是抛弃boto,改用海报库。我仍然使用boto为POST生成一个签名策略和必要的表单字段,但是执行POST的实际可执行文件现在只包括poster。在混合使用poster的情况下,py2exe在为我创建独立的可执行文件以进行重新分发方面没有任何问题。在

我已经成功地用boto&py2exe创建了工作exe

添加到您的脚本.py在

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

下一个错误是HTTPS连接,似乎py2exe以某种方式“隐藏”了证书文件。。 解决这个问题的方法是 1) 使用HTTP 或者 2) 不检查证书

1)HTTP

^{pr2}$

“is_secure=False”是非常重要的

2)不检查证书

conn = boto.connect_dynamodb(
    aws_access_key_id = ' ',
    aws_secret_access_key = ' ', 
    is_secure = True, 
    validate_certs = False)

“validate\u certs=False”是不重要的

如果有人知道如何修复证书验证中的错误,请回复!在

相关问题 更多 >