IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

intégrer donnée binaire dans un script


Sujet :

Python

  1. #1
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut intégrer donnée binaire dans un script
    Bonjour,

    Je cherche à intégrer une chaine de texte représentant un fichier binaire dans un script Python, un peu à la manière des ressources de Qt.

    Voilà un exemple très naïf utilisant le module base64:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import base64
    files = ['toto.py.gz']
    out = open('build.out','w')
    out.write('FILES = { \\\n')
    for f in files:
        data = base64.b64encode(open(p, 'rb').read())
        out.write('    \'%s\':\'%s\', ' % (p, data))
    out.write('}\n')
    out.close()
    le fichier build.out contient alors un dictionnaire que je peux utiliser de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import os
    import base64
    execfile('build.out')
    try:
        os.mkdir('tmp')
    except OSError:
        pass
    os.chdir('tmp')
    for f, data in FILES.iteritems():
        print p, len(data)
        out = open(p, 'wb').write(base64.b64decode(data))
    os.chdir('..')
    ça marche bien. mais je remarque que la chaine encodée avec b64encode est plsu longue que la donnée brute que je manipule. Normal j'imagine puisque je passe par un encodage. J'avais initialement essayé avec binascii.hexlify et j'avais un ratio 2 (comme spécifié dans la doc).

    Je ne maitrise pas du tout ces sujets, quelle est la façon de faire optimale (cad la méthode pour laquelle la taille occupée par la chaine de texte dans mon script est la plus proche possible de la taille réelle du fichier).

    Déjà, est ce que je suis sur la bonne piste avec base64 ?

    on pourrait me dire:

    - ben tu as qu'à faire une tarball et un script qui manipule la tarball !
    - oui oui, je sais faire. c'est plus une curiosité: comment avoir ma tarball et mon script dans le même fichier (et que ce fichier soit un script python)

    Merci pour votre aide !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 770
    Par défaut
    Salut,

    Je ne comprends pas ce que tu veux faire.
    - définir dans le .py un string qui soit la représentation binaire pourquoi pas B64 de je ne sais quoi.
    - lire un fichier B64? dans une variable lors du démarrage?
    Note: je conviens que pour faire 1, il faut peut être passer par 2 histoire de générer le .py automatiquement... Mais tout cela est pour le moins confus.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    ok,

    voici un exemple de script que j'aimerai obtenir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/usr/bin/env python
    import base64
     
    FILES = { \
        'toto.py.gz':'H4sICHGpxUwAA3RvdG8ucHkAS0lNU8hIzcnJ18hLzE3VtOJSAIKi1JLSojwFJQ+QhIJqsYKikoKqAkgBFwAPJne7MAAAAA==', 
    }
     
    def unpack():
        for filename, data in FILES.iteritems():
            open(filename, 'wb').write(base64.b64decode(data))
     
    if __name__ == '__main__':
        unpack()
    Le dictionnaire FILES contient ma donnée (ici c'est un script python gzippé).
    La fonction unpack extrait de ce dictionnaire la donnée et la met dans un fichier (dont le nom est la clé du dictionnaire).

    Je cherche un moyen de rendre la taille de la chaine de texte représentant la donnée dans le dictionnaire aussi proche possible de la taille du fichier.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 770
    Par défaut
    Citation Envoyé par kango Voir le message
    Je cherche un moyen de rendre la taille de la chaine de texte représentant la donnée dans le dictionnaire aussi proche possible de la taille du fichier.
    Certes, certes,...
    Mais pourquoi décoder dans ce cas?
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    en décodant ça me permet de récupérer la donnée initiale (ici mon fichier zippé) non ?

    Il faut bien que je stocke la donnée sous forme de chaine de texte dans le script qui va 'transporter' la donnée.

    Naïvement, je pense que j'ai besoin d'encoder la donnée pour l'intégrer au script et que ce dernier à besoin de la décoder pour reconstituer le fichier. Mais comme je l'ai dit, c'est un sujet que je maitrise très peu donc je peux me tromper.

    Mon exemple marche pas trop mal si on omet le fait que la taille "encodée" est 20% plus importante que la donnée réelle. C'est ce qui me fait dire que je dois passer à côté d'un truc

    Je sais que certaines applications sur Linux utilisent quelquechose qui doit ressembler (c'est pas du Python, c'est du Shell) : exemple les drivers graphiques ATI pour Ubuntu: on ne télécharge qu'un seul fichier (un shell) qui contient les données relatives au driver (binaire, on est sur du code propriétaire là).

    Ah et si je ne passe pas par un encodage, mon fichier Python devient illisible, j'ai une erreur de type SyntaxError (EOL while scanning single-quoted string) avec ce script par exemple (on peut prendre ce qu'on veut comme fichier toto.py.gz):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    import os
    import binascii
    import base64
     
    files = ['toto.py.gz']
    out = open('build.out','w')
    out.write('FILES = { \\\n')
    for p in files:
        #data = binascii.hexlify(open(p, 'rb').read())
        #data = base64.b64encode(open(p, 'rb').read())
        data = open(p, 'rb').read()
        out.write('    \'%s\':\'%s\', \n' % (p, data))
    out.write('}\n')
    out.close()
    execfile('build.out')
    edit: j'ai enfin réussi à mettre un nom sur ce que je veux faire: c'est un binary payload. Voir ici pour les curieux: http://www.linuxjournal.com/content/...-shell-scripts

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir wiztricks,

    En fait c'est très utile et nous en avons déjà parler.

    Citation Envoyé par PauseKawa Voir le message
    Re,

    Pour répondre à wiztricks c'est aussi une idée que j'avais eu il y a un petit moment : Inclure du code (images, binaires, rpm etc...) dans un seul fichier d'installation.
    C'est ce qui est fais en shell par Makeself que nous utilisons au boulot pour mettre à jour les distribs des serveurs.
    Et dans d'autre sujets (Comment inclure des images dans le code etc...)

    Par contre je ne me suis pas encore poser la question de la taille kango (adsl oblige...) avec base64.
    Mais puisque 'tout est objet' pourquoi ne pas utiliser zipfile ?
    A voir si cela donne une erreur EOF.

    Pas le temps de tester tout cela ce soir.

    Bon code

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    oui, je suis tombé sur Makeself aussi en continuant à fouiller.

    la difficulté est je pense l'encodage que je dois utiliser pour stocker la donnée binaire dans le script, zipfile me permettra juste de compresser la donnée avant de l'inclure dans le script.

    la "perte de compression" que j'observe, n'est pas tant un problème que ça je l'admets. C'est plutôt une constatation qui me fait me demander s'il n'y a pas une approche meilleure.

  8. #8
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    A vrais dire zipfile semble être une solution pour binascii, pas pour base64.
    Ou je me plante dans mon code

    Le but de ton code c'est quoi ? Perso j'avais penser à faire un Makeself (Multi OS en plus...) en Python mais je n'ai pas eu le temps de développer plus que quelques scripts (scripts perso, recherches perso et occupation du forum oblige).
    Cela t'intéresse comme projet pour une contribution ?

    Bon code.

  9. #9
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    S'il s'agit de pouvoir intégrer dans la page de code une chaine binaire (une image par exemple), je crois que le module uu est ce qu'il faut. En effet, pour éviter les problèmes d'encodages, il vaut mieux que les caractères codés soient limités à 7 bits, ce que le module uu fait très bien.

    Voilà comment je ferais:

    j'ai une chaine binaire chbin. Pour l'essai, je peux en fabriquer une au hasard comme suit (celle-ci fait 500 caractères, chaque caractère pouvant aller de 0 à 255 bornes comprises):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    from random import randint
    chbin = ''.join([chr(randint(0,255)) for i in xrange(0, 500)])
    Je peux ensuite l'encoder uu en utilisant les fichiers en mémoire StringIO:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    import uu
    import StringIO
     
    f = StringIO.StringIO()
    uu.encode(StringIO.StringIO(chbin), f)
    chuu = f.getvalue()
    Si on affiche chuu, on aura quelque chose comme:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    begin 666 -
    MUJ0^FSC65Z\$^A?]>/P,":L F8AL\PQ#Y0+4PX!N9QHK_+0QVFP#_.R$'KC5
    ML:(/#&/8$6<"!6>D-A-PW5I3YFXMC0E8"Y%0=3S%';X).>C1:*NFGXNE/ ZS
    M4YKN#T4<7PH9X239NHY2K6CU_!:V1J(&QRQ%2><4C=#EFO0<@P.F<#NU]!7K
    MC.0PUIDFLQO$+-$DP26R;8>]\[L!UX637V9_'1=8!:LBBNY%$_1]0?19DH!%
    M*>0L?)JS(5GO??J_Z8+__ DA?A.0Y@=99A-O,YE""W018F'7PN<KEC9#WD_#
    MVI^N\:VT:*-#99#D XJ^5:%KP'Y?N$A6Q3>OYF?:\+Q\EN'49M?'Q/*[N)S.
    M9T)4Q]8!.8)<CN[CX(/ (AJA&*4$ZE23IZ$)6M_.,8:A3AVSU?J/;M-OFB)]
    M4.2G+ )'[+$M3#A>B2IZC@M=KQO.]NASB<8&T<3,7>K/^6)*ZM1GHGO-<$9O
    MM(CM+"6AA(CH$OYW9)ZD>>=_GJ0%4O3=4FC50JC]#H]';'3TEO=FW:]1;&Y!
    M:CD_6J%:3LUW4\H=:>FJ_JEFW&8**RP1T]!VC2MX\ *7/>(XX524<.PU71ZN
    MM(AS?!T,!(&+!]D5,ARY6=GH3K#5)4(-?_9L$-*,?^LIK/>IW9:Y(^5I6V!T
    %CH3UML, 
     
    end
    Et si on veut l'intégrer dans un code source, il faudra simplement ajouter chuu=""" avant, et """ après. En espérant que la chaine encodée ne possède pas ni """, ni '''. Peut-être faudrait-il le vérifier et fabriquer dans ce cas une concaténation (xxx"""yyy => """xxx""" + '"""' + """yyy""")

    Dans ce code source, cette variable sera lu correctement quelque soit l'encodage (même utf-8) puisque ces caractères affichables sont tous <128.

    Voilà comment on peut retrouver la chaine binaire d'origine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    f = StringIO.StringIO()
    uu.decode(StringIO.StringIO(chuu), f)
    chbin2 = f.getvalue()
    et on pourra vérifier que chbin == chbin2

    L'augmentation de taille entre la chaine encodée uu et la chaine binaire d'origine est de l'ordre de +38%. Si on veut en rester à un encodage dans lequel chaque caractère est <128, je ne suis pas sûr qu'on puisse faire mieux.

    Tyrtamos

  10. #10
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    merci tyrtamos

    j'obtiens le même ordre de grandeur de ratio (20-30%) avec base64 (sans les problèmes relatifs au triple quote). je vais quand même tester ta solution pour voir en pratique si le ratio est meilleur (même si ce n'est pas le point le plus gênant pour moi).

    @PauseKawa

    Oui, il s'agit d'une curiosité dans le cadre d'un déploiement de librairies sur un environnement Unix/Linux. Chaque paquet est une tarball réalisée avec distutils. A l'heure actuelle j'ai un script shell plus un tarball de toutes mes tarball de packages. Je cherche une alternative full python et en un seul fichier.

    Mais je me rend compte qu'il est peut être plus immédiat de partir sur un script shell intégrant une binary payload à la fin. Quite à ce qu'il y ait un script python dans la payload qui se charge de traiter le reste de la payload.

    Si j'arrive à avoir une solution 100% Python je peux la poster

  11. #11
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Effectivement, on obtient +33% avec base64 et une chaine de 100000 caractères au hasard, ce qui est un peu mieux que uuencode, sans poser le pb des triples quotes.

    Adopté!

    Comme la chaine encodée est monoligne, on pourrait l'intégrer plutôt sous forme de liste comme suit (ici, ch64 est la chaine encodée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    n = 70
    ch = 'lch64 = [' + os.linesep
    lg = len(ch64)
    i2 = 0 
    while True:
        i1 = i2
        i2 = min(i1+n, lg)
        if i2>i1:
            ch += '"' + ch64[i1:i2] + '",' +  os.linesep
        else:
            break
    ch += ']'
    Ce qui donnera comme résultat quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    lch64 = [
    "oJz9zc5cYss9hA/103gcYb69pnWnlDYbRGOvD4z7yNfGLAfBMq+5iOrSaoQIzq9hNFRKzO",
    "GAOFPkCSqth4iNwAhCZi0WHxLQxsIqj9Y/egPn6JqfwnSBOS8FHfmXuLQAfH/iwGacSVYD",
    "/CoonHpFOMHGHhD37aIooIfIIAAzLbUGBQcVdbGZ/LrGdTcSl0r8uQh2TNQJE4GAlDkD3b",
    "pjT9VPgKVRgSFyElh33AWixQI5fsaYjxggcjoRufuiEMMI5jzAHV+TlLkZHZutvgG3Sh+1",
    "7O/H6nK1kTkbdg6vnvBMngdq1+/cM4FzU805Et8ViaKZEJECTJrNn+KtzylHkjuIpusoiq",
    "H2ZPJxRHBfas6DtVN3/MF1uzvhEwWO3TSZLzZEtki82m1WKPVkCVNFTrISZx0j6ZtLZ61V",
    "QoGx04cn2H7HZH8vcjddOEsFbL60Ujias2ptsEUaGPS6FEYx0DaULlC4qRk1M+LUpYd7wB",
    "kjOrrL+1UNkU0icA0EpOjRfXrlNsfnkK9eaEEmNYzJkhWBMFQ+m4Aqv+NR9gLdKZIy6mSU",
    "Rz/GxD1za2R6dwkcG+UCahhHMEwiJPNHJOMD0qENVkN1PTafuQ31k0WuBPZHjkqfKRRtv9",
    "CTW4Ku3yilt1Wizs+0ulhf2Bcao+0Be7RGOgk=",
    ]
    Pour récupérer dans le code source la valeur binaire décodée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    chbin = base64.b64decode(''.join(lch64))
    Tyrtamos

  12. #12
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    ben merci du coup je reste sur la solution base64 pour le moment.

  13. #13
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Et comme j'étais intéressé par le sujet pour mes projets perso, j'en ai fait un petit tuto:

    http://python.jpvweb.com/mesrecettes...ersions_base64

    Tyrtamos

  14. #14
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    cool merci tyrtamos

    Citation Envoyé par PauseKawa Voir le message
    Cela t'intéresse comme projet pour une contribution ?
    why not, voici de mon côté le petit script que j'ai fait si ça peut intéresser.

    et puis si ça peut intéresser d'autres gens, je peux uploader le projet sur launchpad.

    edit: je mets en résolu mais ça nous empêche pas de continuer à discuter :p
    Fichiers attachés Fichiers attachés

  15. #15
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Petite notes:

    testinstall1.zip > binaires, gif, scripts > tous lisibles après:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    import binascii
    import base64
     
    def lirefichier(fichier):
        with open(fichier, 'rb') as f:
            donnees = f.read()
        return binascii.b2a_hex(donnees)
     
    datas = lirefichier('testinstall1.zip')
     
    script="""#!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    #
    import binascii
     
    datas = binascii.a2b_hex('""" + datas + """')
     
    def ecrirefichier(fichier, donnees):
        with open(fichier, 'wb') as outf:
            outf.write(donnees)
     
    ecrirefichier('datas.zip', datas)"""
     
    with open('setup.py', 'w') as f:
        f.write(script)
    #-------------------------------
     
    def lirefichier1(fichier):
        with open(fichier, 'rb') as f:
            donnees = f.read()
        return base64.b64encode(donnees)
     
    datas = lirefichier1('testinstall1.zip')
     
    script="""#!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    #
    import base64
     
    datas = base64.b64encode('""" + datas + """')
     
    def ecrirefichier(fichier, donnees):
        with open(fichier, 'wb') as outf:
            outf.write(donnees)
     
    ecrirefichier('datas1.zip', datas)"""
     
    with open('setup1.py', 'w') as f:
        f.write(script)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    patrice@Zeus:~/Bureau$ ls -Al setu*.py
    -rw-r--r-- 1 patrice patrice 183498 2010-10-28 21:22 setup1.py
    -rw-r--r-- 1 patrice patrice 275127 2010-10-28 21:22 setup.py
    +1 pour base64
    A comparer avec tar entre autre.

    Pourquoi ne pas faire les imports utiles suivant le type d'installation ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        # required modules
        b.write('import base64\n')
        # manque b.write('import binascii\n')
        b.write('import os\n')
        b.write('import sys\n')
        b.write('import subprocess\n')
        b.write('import tarfile\n')
    Soit en gros faire une création de runscript par blocs.

    Ceci dit par rapport à ton code j'étais plus de mon coté pour un script plus 'complexe' (en gros un 'sefl install'): Dico pour les 'fichiers' (/var/lib par exemple), 'binaires' (/usr/bin), scripts shell, etc... Et ce Multi-os.
    Avec une chronologie pour la lecture du dico inclus dans le setup.
    J'étais donc plus dans une idée interface de création graphique (tkinter pour rester de base) pour la création du setup.
    Et au choix une interface shell ou graphique pour le setup...
    C'est un travail monstre en fait et comme j'avais ce que je voulais pour mes maj de programme j'ai laisser tomber.

    Bon code

  16. #16
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Par défaut
    oui, ici le détail a été laissé au script d'installation qui peut aussi être "packagé" avec le script résultat. c'est finalement ce qui donne le plus de souplesse.

    après un système permettant d'encadrer et d'automatiser au moins une partie de la création du script d'installation peut être envisagé.

    dans mon cas j'en ai uniquement besoin pour déployer des packages distutils donc, le détail du genre "quel fichier va où" est complètement délégué à cette librairie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer des données mysql dans un script bash
    Par xunil2003 dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 28/07/2012, 20h33
  2. [poweramc] casse mixte des données perdue dans le script sql
    Par goran kajfes dans le forum PowerAMC
    Réponses: 1
    Dernier message: 16/10/2009, 18h30
  3. Réponses: 1
    Dernier message: 08/11/2007, 12h20
  4. [Débutant]Intégrer du perl dans un script bash
    Par kromartien dans le forum Langage
    Réponses: 3
    Dernier message: 05/03/2007, 23h23
  5. [MySQL] lecture de données binaires dans une BDD
    Par Sion_Sempai dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/03/2006, 12h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo