2010-09-30 22 views
1

J'essaie de compiler un simple programme Python, qui télécharge des fichiers dans un compartiment S3 en utilisant le paquet boto, dans un seul fichier redistribuable .exe. Je suis ouvert à toute méthode de compilation. Jusqu'à présent, j'ai essayé à la fois bbfreeze et py2exe et les deux donnent les mêmes résultats. Le code en question qui cause des problèmes ressemble à ceci:Comment compiler du code python qui utilise boto pour accéder à S3?

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) 

compilée avec l'utilitaire de bottelage exécutable et exécutez-je obtenir:

Traceback (most recent call last): 
    File "s3stash.py", line 238, in <module> 
    sys.exit(main()) 
    File "s3stash.py", line 225, in main 
    push_file_to_s3(f, options) 
    File "s3stash.py", line 160, in push_file_to_s3 
    _push_with_boto(fname) 
    File "s3stash.py", line 148, in _push_with_boto 
    s3 = boto.connect_s3(aws_access_key_id=_aws_key, aws_secret_access_key=_aws_secret_key, is_secure=False); 
    File "boto\__init__.pyo", line 104, in connect_s3 
    File "zipextimporter.pyo", line 82, in load_module 
    File "boto\s3\connection.pyo", line 27, in <module> 
    File "zipextimporter.pyo", line 82, in load_module 
    File "boto\utils.pyo", line 55, in <module> 
    File "email\__init__.pyo", line 79, in __getattr__ 
ImportError: No module named multipart 

J'utilise ActiveState Python 2.6 sous Windows XP SP3. Le paquet Boto a été installé avec:

easy_installer --always-unzip boto 

J'ai utilisé l'option --always-unzip à partir des informations sur les found herepy2exe ayant des problèmes avec les fichiers d'œufs qui ont été déballés. Malheureusement, l'erreur que je reçois est la même lorsque j'utilise bb-freeze pour générer l'exécutable.

La sortie de py2exe comprend, à la fin, le bit d'information suivant:

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

Ce qui donne quelques conseils. J'ai essayé des méthodes suggérées dans d'autres messages à SO où l'option -i a été recommandée lors de la compilation avec py2exe et malheureusement rien n'a aidé. Dans ces autres questions, les utilisateurs faisaient leur propre inclusion explicite des sous-modules de courrier électronique. Je ne pouvais pas comprendre comment adapter ces solutions à mon cas malheureusement et juste en les ajoutant avec -i n'a pas arrêté py2exe de me prévenir des modules manquants, ou l'exe groupé résultant d'échouer avec l'erreur de module manquant. Est-ce que quelqu'un peut m'aider à obtenir ce code pour la redistribution?

Répondre

1

J'ai vraiment eu ce travail. La réponse a été d'abandonner boto et d'utiliser la bibliothèque d'affiches à la place. J'utilise toujours boto pour générer une politique signée et les champs de formulaire nécessaires pour POST que je fais via poster, mais l'exécutable réel qui fait le POST ne comprend maintenant affiche maintenant. Avec juste affiche dans le mélange, py2exe n'a aucun problème à créer un exécutable autonome pour moi pour la redistribution.

1

Je sais que c'est une vieille question, mais j'ai eu le même problème et je l'ai corrigé tout en utilisant py2exe et py2app. Il suffit d'utiliser l'option 'packages' au lieu du 'comprend' option dans votre setup.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 
) 

espoir qui aide.

+0

Salut, merci pour cela. Je vais l'essayer! –

1

J'ai réussi à créer exe travailler avec Boto & py2exe

Ajouter à votre script.py

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

erreur suivante est une connexion HTTPS, il semble que py2exe est "cache" fichier cert en quelque sorte.. La façon de résoudre ce problème est 1) Utiliser HTTP OU 2) DonT vérifier certs

1) HTTP

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

"is_secure = False" est crutial

2) DonT VÉRIFIER CERTS

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

"validate_certs = False" est crutial

Si quelqu'un trouve comment corriger une erreur dans la validation de cert, répondez!

+0

C'est cool, mais j'ai besoin de https pour la sécurité. J'ai récemment abandonné py2exe en faveur de PyInstaller et j'ai obtenu de meilleurs résultats, même si je n'ai pas encore essayé une application compatible boto. –

+0

vous ne creusez pas https. Je veux dire, https fonctionne toujours, mais vous ne vérifiez pas le certificat. C'est une grosse différence. URLLIB2 par défaut ne vérifie pas le certificat. Ce n'est vraiment pas une grosse affaire – Goranek

+0

Ne pas vérifier les certificats est une très grosse affaire pour l'application avec laquelle je travaille. –