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 :

Quelle version de Python au démarrage d'un script?


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 262
    Points : 93
    Points
    93
    Par défaut Quelle version de Python au démarrage d'un script?
    Bonjour,

    Je vous expose ici mon problème et davance merci pour les explications que vous pourrez m'apporter.

    J'utilise plusieurs versions de Python (2.4; 2.6 et 3.1).
    Je peux sans problème copier mes scripts créés avec la version 2.4 et les coller ou je veux, cela fonctionne sans problème. Malheureusement ceci ne fonctionne pas avec les autres versions. Tant que j'y accède par l'intermédiaire de l'IDLE de la version concernée cela fonctionne mais impossible ensuite de déplacer les scripts.

    Petites précisions:
    -Je travaille sur Windows.
    -Dans ma variable environnement, pour 'path', j'ai ajouté :;C:\Python26\;C:\Python31\

    Je suppose qu'après avoir déplacé le script celui-çi veuille démarrer en version 2.4 et je ne vois pas comment résoudre ce problème.

    Sur le net, j'ai bien vu qu'en 1er ligne, on pouvait mettre:
    mais si j'ai bien compris ceci est réservé aux utilisateurs Unix.

  2. #2
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    C'est bien, tu as ajoutés les différent répertoires d'installation a PATH. Maintenant, le petit hic, c'est que quelquesoit les versions de python, le nom de leur exe respectifs est le même, ce qui à pour effet que lorsqu'on tape python dans une console système, la version de python executée sera la première trouvée . Je dirais que pour d=résoudre ce problème, il suffit d'aller dans le repertoire d'installation de chaque version de rennommer python.exe et pythonw.exe par python24.exe pythonw24.exe (pour la v 2.4 par exemple), et ainsi de suite...

    Les commandes à taper dans une console serait alors non plus python mais python24 ou python26 etc... pense à vérifier également les association pour explorer.

    Avoir le choix des versions à utiliser pour ce dernier, necessite un peu d'acrobatie du côté des registres, et j'avoue que j'ai pas envie de me pencher dessus, je l'ai jamais fait. c'est néanmoins très faisable, il faut retrouver la partie 'edit with IDLE' dans le registre, bien observer, et reproduire grosso merdo le même schéma.

    Bon courage

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2007
    Messages : 105
    Points : 145
    Points
    145
    Par défaut
    Bonjour,

    Je verrais deux autres solutions:

    La première en utilisant un script batch qui modifie la variable d'environnement PATH et exécute le script en question.
    Evidemment, il faudra au préalable enlever toutes les références à Python dans la variable PATH.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PYTHON24.BAT:
    @ECHO OFF
    CLS
    PATH=%PATH%;C:\PYTHON24\
    PYTHON %1 %2 %3 %4 %5 %6 %7 %8 %9
    Ainsi de suite pour les autres versions.

    Maintenant, la deuxième solution, c'est en utilisant Eclipse & PyDev.
    Dans les préférences de PyDev il est possible de définir plusieurs interpréteurs et ensuite dans les propriétés d'exécution du script de choisir l'interpréteur de son choix.
    C'est valable que pendant la période de développement du script.
    Mais, bon, quand le script est terminé, j'imagine que le choix de l'interpréteur l'est lui aussi!

    Salutations.

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Pour les petits projets en période de développement, Ulipad permet aussi de basculer très facilement d'un interpréteur Python à un autre.

  5. #5
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Pour avoir le choix des versions depuis explorer, je viens de me rendre compte que les manip avec les registre sont automatisées depuis le bon menu, et ça devient un jeu d'enfant...

    Marche à suivre:
    1. ouvrir l'explorer (ouvrir un dossier quoi..)
    2. Menu Outils
    3. Options des dossiers
    4. Onglet Types de fichiers
    5. Aller sur l'extension PY et cliquer sur le bouton Avancé
    6. Nouveau...
    7. mettre le nom de l'action dans le champ Action, cliquer sur Parcourir et selectionnez le python(24 ou 26...).exe
    8. Dans le champ "Application utilisée [...]", allez à la fin de la chaîne, et ajouter un espace plus "%1" (guillemets compris)
    9. Valider
    10. Repeter les étapes 6 à 9 pour chaques versions de python, une fois fait, choisir l'action par défaut à executer, puis valider toutes les fenêtres

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 262
    Points : 93
    Points
    93
    Par défaut
    Tout d'abord, merci à tous pour vos suggestions.

    Je me suis particulièrement intéressé à celles de N.tox.
    J'ai donc renommer mes fichiers python.exe et pythonw.exe par python24.exe pythonw24.exe ,et ainsi de suite... J'ai été surpris de voir que suite à celà lors du démarrage des IDLE concernés, un réinstallation s'en suivait. Ceci dit aucun problème
    Même chose quant aux petites manipulations dans 'explorer'. Les explications de N.tox sont très précises et tout fonctionne. Lorsque je veux démarrer un script, je fais un clic droit et je choisis la version de Python qui doit le démarrer.

    Cependant, mon problème n'est pas résolu...

    1/ En fait, si je démarre un scrit en choississant une version de Python ( ou si pour ce script, je lui indique en propriété 'démarrer avec telle version', il se trouve que ceci s'applique aussi aux autres scripts. Autrement dit, je suis obligé systématiquement de faire un clic droit pour choisir la version correcte.

    2/ Ensuite et c'est cela le plus important pour moi, je souhaite pouvoir démarrer un script par programmation càd un script en 2.6 doit pouvoir démarrer un script en 3.1


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import os
    os.system("C:\Documents and Settings\Chris33\Bureau\s'ouvre avec Python 3.1\monscript.py argument_transmi")

  7. #7
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    Pour ça, le but est pratiquement le même. L'idée est de créer un script qui devra checker les 5 première lignes du script cible et reperer une balise indiquant quelle version de ptyhon utiliser pour lancer ce script cible.

    Donc pour ce faire, il faut tout d'abord créer le script de démarage :
    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
    import sys,os
     
    filename     = sys.argv[1]
    #filename correspond au chemin (nom compris) du script cible
    _path, _file = os.path.split(filename)
    #ce nom de fichier est décortiqué en deux éléments:
    #   le chemin
    #   le nom du fichier
     
    pythonpath={'24':'D:\\MyPath24\\ptyhon24.exe','26':'D:\\MyPath26\\ptyhon26.exe','30':'D:\\MyPath30\\ptyhon30.exe'}
     
     
    #DEBUT du repérage de la balise de version dans le script cible
    _fin=open(filename,'r')
    c=0
    version=None
    for line in _fin:
        if line.startswith('#v:'):
            version=line[3:5]
            break
        if c>=5: break
        c += 1
    _fin.close()
    del c
    #FIN du repérage
     
    # mise du répertoire du script cible en tant que répertoire courant
    os.chdir(_path)
     
    if not version: #aucune balise trouvée
        os.system(pythonpath['26']+' '+_file) #lancement du script via python26
    else:#balise trouvée
        os.system(pythonpath[version]+' '+_file) #lancement du script via le bon python
    Ensuite :
    1. ouvrir l'explorer
    2. outils > option des dossiers > type de fichiers
    3. aller sur l'extension PY > avancé
    4. nouveau
    5. mettre le nom de l'action dans le champ Action, cliquer sur Parcourir et sélectionner python26.exe
    6. Dans le champ "Application utilisée [...]", allez à la fin de la chaîne, et ajouter un espace plus ,entre guillemet, le chemin complet vers le script de démarrage plus "%1" (guillemets compris)
    7. valider


    Et voilà ! J'ai pas test, mais j'ai fait une manip similaire qui fonctionne très bien, j'en déduis que cela devrait fonctionner.

    les script cibles devront donc comporter une balise, qui dans l'exemple suit le pattern suivant :
    où XX est le numero de version de python (24,26,30).

    Depuis la console système... ben... il est trop tard et je raisonne plus clairement...

  8. #8
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Petite idée (je ne suis pas sous Windows donc à tester)
    Sous Windows la recherche dans le path est linéaire non ?
    Donc si dans le premier chemin (%SystemRoot%\system32 ?) il existe un 'python.bat' c'est lui qui est exécuté (non ?).

    Un bat du style :

    @echo off
    c:\cheminpython\ptyhon26.exe c:\cheminversmonlanceur\lanceurpython.py %1

    @+
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 262
    Points : 93
    Points
    93
    Par défaut
    encore merci à N.tox pour ta réponse.
    Je reprends ton exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pythonpath={'24':'D:\\MyPath24\\ptyhon24.exe',}
    Pour simplifier à l'extrème ton exemple, je souhaite ouvrir 'monfichier.py' crée en version 3.1 et qui se trouve:
    C:\Python31\MesscriptsenPython3

    Dois-je utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system("C:\\Python31\\MesscriptsenPython3\\monfichier.py argument")
    auquel cas je ne comprends toujours pas comment ce script utilisera la bonne version de Python.

    ou:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system("C:\\Python31\\MesscriptsenPython3\\python31.exe monfichier.py argument")
    Dans ce dernier cas l'interpréteur serait bien fourni. Mais dans les 2 cas, ceci ne semble pas fonctionner

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 262
    Points : 93
    Points
    93
    Par défaut
    Il semble qu'effectivement la bonne commande soit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system("C:\Python31\pythonw.exe"+" essai5.py")
    Cependant voici 2 modules:

    module1: test_essai5.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    import sys
    import os
     
    print" Le script : ",sys.argv[0]," démarre avec : ",sys.executable
    os.system("C:\Python31\pythonw.exe"+" essai5.py")
    module2: essai5.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    import sys
    print(" Le script : ",sys.argv[0]," démarre avec : ",sys.executable)
    input("tape une lettre...")



    Le module 2 lancé seul donne :
    Le script : C:\Python31\MesscriptsenPython31\essai5.py démarre avec : C:\Python31\pythonw.exe
    tape une lettre...


    Le module 1 lancé seul donne :
    Le script : C:\Python26\MesscriptsenPython26\test_cible26.py démarre avec : C:\Python26\pythonw.exeJe vois bien une fenêtre dos apparaître mais elle disparaît aussitôt et cela malgré la présence d'une instruction input dans le module concerné...

    Autre chose:
    Lorsque j'ai renommé les dossier exécutable, une réinstallation s'en est suivi et à nouveau les dossiers python.exe sont recréés d'office

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut virtualenv
    virtualenv permet de faire cela sans se poser trop de questions: la version de Python et ses bibliothèques sont installées dans un répertoire particulier et pour activer l'un ou l'autre, il suffit "d'activer" l'environnement en question.
    Pas besoin de recopier ses scripts, pas besoin de hacker les variables d'environnements, tout est déjà prêt à utiliser.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    La solution de N.tox me semble bien plus simple.
    Comme le fait remarquer Chris33 pas mal de scripts débutent par un pseudo commentaire et c'est utilisable.
    Pour les autres soit il n'y a rien soit c'est des scripts perso donc la mise en place d'un pseudo commentaire ou d'un #v:XX deviens vite une habitude.

    Donc sur l'idée de N.tox:

    Exemple d'un script C:\Python26\lanceurpython.py sur la base de celui de N.tox avec prise en compte de la ligne 0

    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
    58
    59
    60
    61
    62
    63
    #!/usr/bin/env python
    #
    #
    #
    # lanceurpython.py : Selection automatique de la version de python suivant
    # l'entete du script
    #
    from sys import argv
    from os.path import split
    from os import system, chdir
     
    filename=argv[1]
    _path, _file=split(filename)
    try:
        if argv[2]: Arguments = ' ' + argv[2]
    except: Arguments = ''
     
    pythonpath={'24':'C:\\Python24\\python.exe','26':'C:\\Python26\\python.exe','31':'C:\\Python31\\python.exe'}
    # pythonpath={'24':'/usr/bin/python2.4','26':'/usr/bin/python2.6','31':'/usr/bin/python3.0'} # Pour tests linux
     
    _fin=open(filename,'r')
    c=0
    version=None
    for line in _fin.readlines():
        if c==0:
            if line[0:22] == '#!/usr/bin/env python3' or line[0:18] == '#!/usr/bin/python3' or line[0:24] == '#!/usr/local/bin/python3':
                version='31'
                Pseudo_Trouve = "python3"
                break
            elif line[0:24] == '#!/usr/bin/env python2.6' or line[0:20] == '#!/usr/bin/python2.6' or line[0:26] == '#!/usr/local/bin/python2.6':
                version='26'
                Pseudo_Trouve = "python2.6"
                break
            elif line[0:24] == '#!/usr/bin/env python2.4' or line[0:20] == '#!/usr/bin/python2.4' or line[0:26] == '#!/usr/local/bin/python2.4':
                version='24'
                Pseudo_Trouve = "python2.4"
                break
            elif line[0:21] == '#!/usr/bin/env python' or line[0:17] == '#!/usr/bin/python' or line[0:23] == '#!/usr/local/bin/python':
                version='26' # Version par defaut dans ce cas
                Pseudo_Trouve = "python"
                break
        elif line.startswith('#v:'):
            version=line[3:5]
            Pseudo_Trouve = '#v:' + version
            break
        if c>=5: break
        c += 1
    _fin.close()
    del c
     
    if _path: chdir(_path)
     
    print 'lanceurpython.py :'
    if not version:
        print "Pas d'indication"
        print 'Lancement de',_file,'avec Python2.6'
        if Arguments: print 'Avec pour arguments', Arguments
        system(pythonpath['26']+' '+_file+Arguments)
    else:
        print 'Le script contient :', Pseudo_Trouve
        print 'Lancement de',_file,'avec Python', version
        if Arguments: print 'Avec pour arguments', Arguments
        system(pythonpath[version]+' '+_file+Arguments)
    'Et après ? Comment lancer les scripts avec ?'

    Pour la ligne de commande il suffit de créer un fichier python.bat dans le premier chemin du PATH (%SystemRoot%\system32 soit C:\windows\system32 dans la plupart des cas : faire un echo ou voir sous windows) du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @echo off
    echo Lancement de lanceurpython
    C:\Python26\python.exe C:\Python26\lanceurpython.py %*
    Pour Windows qu'importe que cela soit un bat, il suffit que cela soit un exécutable (bat, exe, com). Il vas donc prendre le premier dans le PATH et une commande python monscript.py lanceras en fait c:\windows\system32\python.bat monscript.py qui lui même lance c:\Python26\python c:\Python26\lanceurpython.py monscript.py. lanceurpython.py sélectionnant la version à utiliser suivant l'entête du script.

    'Et pour les association ?'
    C'est à associer avec c:\windows\system32\python.bat %1

    Une fois en place c'est transparent.

    @+

    Ps : Pour les tests sous tux j'utilise

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    echo 'lancement de '$*
    /usr/bin/python2.6 /home/monchemin/lanceurpython.py $*
    Edit pour une petite modif pour Arguments =
    Merci d'utiliser le forum pour les questions techniques.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 241
    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 241
    Points : 36 698
    Points
    36 698
    Par défaut
    Ca marche mais c'est limité à la version de Python alors que dans mon cas, je peux avoir plusieurs environnements - au sens des packages / bibliothèques installés sur une version X de Python.
    => la version n'est qu'un discriminant parmi d'autres.
    Ceci dit, virtualenv permet d'utiliser le chemin vers l'interpréteur de la même façon. Autrement dit, on peut associer le chemin d'un environnement au script si nécessaire.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Sans doute mais il me semble que c'était la question de Chris33 et cela a l'avantage d'être complètement transparent une fois en place : pas d'environnement à choisir etc...
    Je ne doute pas des qualités de virtualenv mais cela reviens a choisir la version/environnement à chaque lancement, ce que Chris33 signale plus haut ('Autrement dit, je suis obligé systématiquement de faire un clic droit pour choisir la version correcte.') comme gênant.
    Je trouve que la réponse vas dans le sens de la question.
    Merci d'utiliser le forum pour les questions techniques.

  15. #15
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    J'ai fais un peut mumuse avec le script précédent ce matin.
    Cela s'éloigne du sujet et ce n'est qu'une ébauche mais si cela intéresse quelqu'un...

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    #!/usr/bin/env python
    #
    #
    #
    # lanceurpython.py : Selection automatique de la version de python suivant
    # l'entete du script
    #
    from sys import argv
    from os.path import split
    from os import system, chdir, linesep
    from string import lower
    from Tkinter import *
    from platform import system as SystemOS
     
    def Lance_Python():
        if SystemOS() == 'Windows':
            pythonpath=={'24':'C:\\Python24\\python.exe','26':'C:\\Python26\\python.exe','31':'C:\\Python31\\python.exe'}
        elif SystemOS() == 'Linux':
            pythonpath={'24':'/usr/bin/python2.4','26':'/usr/bin/python2.6','31':'/usr/bin/python3.0'}
        elif SystemOS == 'Darwin':
            pythonpath={'24':'/usr/local/bin/python','26':'/usr/local/bin/python','31':'/usr/local/bin/python'}
            # ?
        else:
            print 'Systeme non pris en charge'
            quit()
        if _path: chdir(_path)
        print 'lanceurpython.py :'
        if not version:
            print "Pas d'indication"
            print 'Lancement de',_file,'avec Python2.6'
            if Arguments: print 'Avec pour arguments', Arguments
            system(pythonpath['26']+' '+_file + ' ' + Arguments)
        else:
            print 'Le script contient :', Pseudo_Trouve
            print 'Lancement de',_file,'avec Python', version
            if Arguments and len(Arguments) > 0: print 'Avec pour arguments', Arguments
            system(pythonpath[version]+' '+_file + ' ' + Arguments)
        quit()
     
    def Verif_Version():
        _fin=open(filename,'r')
        c=0
        version=None
        for line in _fin.readlines():
            if c==0:
                if line[0:22] == '#!/usr/bin/env python3' or line[0:18] == '#!/usr/bin/python3' or line[0:24] == '#!/usr/local/bin/python3':
                    version='31'
                    Pseudo_Trouve = "python3"
                    break
                elif line[0:24] == '#!/usr/bin/env python2.6' or line[0:20] == '#!/usr/bin/python2.6' or line[0:26] == '#!/usr/local/bin/python2.6':
                    version='26'
                    Pseudo_Trouve = "python2.6"
                    break
                elif line[0:24] == '#!/usr/bin/env python2.4' or line[0:20] == '#!/usr/bin/python2.4' or line[0:26] == '#!/usr/local/bin/python2.4':
                    version='24'
                    Pseudo_Trouve = "python2.4"
                    break
                elif line[0:21] == '#!/usr/bin/env python' or line[0:17] == '#!/usr/bin/python' or line[0:23] == '#!/usr/local/bin/python':
                    version='26'
                    Pseudo_Trouve = "python"
                    break
            elif line.startswith('#v:'):
                version=line[3:5]
                Pseudo_Trouve = '#v:' + version
                break
            if c>=5: break
            c += 1
        _fin.close()
        del c
        return version, Pseudo_Trouve
     
    def En_Graphique():
     
        def Check24_Checkbutton_IntVar_Callback(varName, index, mode):
            if Check24_Checkbutton_IntVar.get() == 1:
                Check26_Checkbutton_IntVar.set(0)
                Check31_Checkbutton_IntVar.set(0)
            Verif_Choix()
     
        def Check26_Checkbutton_IntVar_Callback(varName, index, mode):
            if Check26_Checkbutton_IntVar.get() == 1:
                Check31_Checkbutton_IntVar.set(0)
                Check24_Checkbutton_IntVar.set(0)
            Verif_Choix()
     
        def Check31_Checkbutton_IntVar_Callback(varName, index, mode):
            if Check31_Checkbutton_IntVar.get() == 1:
                Check24_Checkbutton_IntVar.set(0)
                Check26_Checkbutton_IntVar.set(0)
            Verif_Choix()
     
        def Verif_Choix(event = None):
            if Check31_Checkbutton_IntVar.get() == 0 and Check24_Checkbutton_IntVar.get() == 0 and Check26_Checkbutton_IntVar.get() == 0:
                Check26_Checkbutton_IntVar.set(1)
     
        def scrolle(*args):
           if args[0]=='scroll':
              Options.xview_scroll(args[1],args[2])
           if args[0]=='moveto':
              Options.xview_moveto(args[1])
     
        def Valide_Lance():
            global version
            if len(Options.get()) > 0:
                global Arguments
                Arguments=' '+Options.get()
            if Check24_Checkbutton_IntVar.get() == 1:
                version='24'
            elif Check26_Checkbutton_IntVar.get() == 1:
                version = '26'
            elif Check31_Checkbutton_IntVar.get() == 1:
                version = '31'
            Lance_Python()
     
        fenask = Tk()
        fenask.geometry("%dx%d+%d+%d" % (300,400, (fenask.winfo_screenwidth()-300)/2, (fenask.winfo_screenheight()-400)/2 ) )
        fenask.resizable(False,False)
        Conteneur = Frame(fenask, bd=1, relief=SUNKEN)
        Conteneur.pack(side=TOP, fill=X, padx=5, pady=8)
        Label(Conteneur, fg='dark slate blue', text = 'Lancement du script :'+linesep+linesep+filename).pack(side=TOP, pady=10) 
        Frame(Conteneur, height=2, bd=1, relief=SUNKEN).pack(side=TOP, fill=X, padx=5, pady=8)
        Label(Conteneur, fg='dark slate blue', text = 'Version de Python pour ce script :').pack(side=TOP, pady=10)
        Check24_Checkbutton = Checkbutton(Conteneur, fg='dark slate blue', activeforeground='#2a7aff', text=' Python 2.4', relief="flat")
        Check24_Checkbutton.pack(side=TOP, pady=5)
        Check24_Checkbutton_IntVar = IntVar()
        Check24_Checkbutton.configure(variable = Check24_Checkbutton_IntVar, onvalue=1, offvalue=0)
        Check24_Checkbutton_IntVar_traceName = Check24_Checkbutton_IntVar.trace_variable("w",  Check24_Checkbutton_IntVar_Callback)
        Check26_Checkbutton = Checkbutton(Conteneur, fg='dark slate blue', activeforeground='#2a7aff', text=' Python 2.6', relief="flat")
        Check26_Checkbutton.pack(side=TOP, pady=5)
        Check26_Checkbutton_IntVar = IntVar()
        Check26_Checkbutton.configure(variable = Check26_Checkbutton_IntVar, onvalue=1, offvalue=0)
        Check26_Checkbutton_IntVar_traceName = Check26_Checkbutton_IntVar.trace_variable("w",  Check26_Checkbutton_IntVar_Callback)
        Check31_Checkbutton = Checkbutton(Conteneur, fg='dark slate blue', activeforeground='#2a7aff', text=' Python 3.1', relief="flat")
        Check31_Checkbutton.pack(side=TOP, pady=5)
        Check31_Checkbutton_IntVar = IntVar()
        Check31_Checkbutton.configure(variable = Check31_Checkbutton_IntVar, onvalue=1, offvalue=0)
        Check31_Checkbutton_IntVar_traceName = Check31_Checkbutton_IntVar.trace_variable("w",  Check31_Checkbutton_IntVar_Callback)
        if version == '24': Check24_Checkbutton_IntVar.set(1)
        elif version == '26': Check26_Checkbutton_IntVar.set(1)
        elif version == '31': Check31_Checkbutton_IntVar.set(1)
        Frame(Conteneur, height=2, bd=1, relief=SUNKEN).pack(side=TOP, fill=X, padx=5, pady=8)
        Label(Conteneur, fg='dark slate blue', text = 'Arguments de la ligne de commande :').pack(side=TOP, pady=10)
        scr = Scrollbar(Conteneur, orient=HORIZONTAL, command = scrolle)
        Options = Entry(Conteneur, fg='#2a7aff', xscrollcommand = scr.set)
        Options.pack(side=TOP, fill=X, padx=10)
        scr.pack(side=TOP, fill=X, padx=10, pady=1)
        Options.insert(0, Arguments[1:])
        Frame(Conteneur, height=2, bd=1, relief=SUNKEN).pack(side=TOP, fill=X, padx=5, pady=8)
        Button(Conteneur, text='Lancement du script', fg='dark slate blue', command=Valide_Lance).pack(side=LEFT, padx=5, pady=10)
        Button(Conteneur, text='Quitter', fg='dark slate blue', command=quit).pack(side=RIGHT, padx=5, pady=10)
        fenask.mainloop()
     
    Arguments = ''
    if len(argv) < 2:
        print 'Usage:'
        print 'python <nomduscript.py> <argumentsoptionnels>'
        print 'Ou pour un usage graphique:'
        print 'python v <nomduscript.py> <argumentsoptionnels>'
        quit()
    elif len(argv) == 2:
        filename=argv[1]
    else:
        if argv[1].lower() == 'v':
            filename=argv[2]
            listeargs = 3
        else:
            filename=argv[1]
            listeargs = 2
        while listeargs < len(argv):
            Arguments = Arguments + ' ' + argv[listeargs]
            listeargs = listeargs + 1
     
    if filename[-2:].lower() != 'py' and filename[-3:].lower() != 'pyc':
        print 'Donnez un script python en argument'
        quit()
     
    _path, _file=split(filename)
    version, Pseudo_Trouve=Verif_Version()
     
    if filename == argv[1]: Lance_Python()
    else: En_Graphique()
    @+
    Merci d'utiliser le forum pour les questions techniques.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 262
    Points : 93
    Points
    93
    Par défaut
    Merci à tous et tout particulièrement à PauseKawa.

    C'est effectivement cette solution qui m'intéresse le plus. Je suis en train de tester ta proposition (faute de temps, pas encore celle que tu as posté ce matin à 10h23 mais la précédente) et cela semble fonctionner. Ce qui coince encore
    c'est que si les scripts démarrent avec la bonne version de pyton, l'argument transmi n'est pas récupéré. Je pense qu'il y a encore quelque chose qui m'échappe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import os
    os.system("C:\Python31\MesscriptsenPython3\monscript.py argument_transmi")

  17. #17
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Dans un premier temps c'est une idée de N.tox (rendre à N.tox ce qui est à N.tox ). Je ne fais que du plagia.

    Ceci dit avec mes tests de ce matin si avec les associations tu fais c:\windows\system32\python.bat v %1

    Cela donne

    Nom : script.jpg
Affichages : 2194
Taille : 18,1 Ko

    "C:\Python31\MesscriptsenPython3\monscript.py argument_transmi" n'est pas possible.
    "C:\Python31\MesscriptsenPython3\monscript.py " + argument_transmi
    Oui (avec argument_transmi = sys.argv[X])

    @+
    Merci d'utiliser le forum pour les questions techniques.

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 262
    Points : 93
    Points
    93
    Par défaut
    Ces 2 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    os.system("C:/Python31/MesscriptsenPython3/monscript.py " + argument_transmi)
    os.system ("C:/Python31/MesscriptsenPython3/monscript.py argument_transmi")
    fonctionnent avec python 2.4 et à condition que je j'utilise des scripts situés dans c:\python24.

    Par contre de cette manière je n'y arrive pas avec les autres versions de python et pas non plus avec le fichier 'lanceurpython'.

    Voici une copie de ma variable environnement path:
    %GTK_BASEPATH%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\ATI Technologies\ATI Control Panel;C:\PROGRA~1\FICHIE~1\TVNAVI~1;C:\Python24; C:\Program Files\Fichiers communs\GTK\2.0\bin;C:\Program Files\QuickTime\QTSystem\;"C:\Program Files\Zone Labs\ZoneAlarm\MailFrontier";C:\Program Files\Samsung\Samsung PC Studio 3\;c:\Program Files\Microsoft SQL Server\100\Tools\Binn\;c:\Program Files\Microsoft SQL Server\100\DTS\Binn\;C:\Python26\;C:\Python31\;C:\WINDOWS\system32\python.bat v%1

    j'ai essayé aussi de remplacer "python.bat %1" par "python.bat v%1" mais sans succès.

  19. #19
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    C'est sûrement à cause du repertoire courant, qui n'est pas celui du script cible, Je dis ça cause tu à l"air d"essayer de simuler l'effet des scripts lanceurs directement via console (et je dis ça à cause des os.system() dans tes messages). C'est pourquoi PauseKawa et moi-même utilison dans les scripts lanceurs un os.chdir(le répertoire du script cible) qui permet de justement changer le répertoire courant.

    @PauseKawa : très bonne idée que l'utilisation d'un batch, vu que c'est aussi bien valable pour la console, que pour l'explorer.

    @chriss33 : Je ne vois pas où cela coince chez toi, cause chez moi tout ceci fonctionne au poil. Serait-il possible d'obtenir plus de précision ?

    essayes ce pseudo script lanceur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sys
    print sys.argv[1]
    Si tu veux pouvoir lancer ton script cible et lui passer un argument à lui aussi, il faudra modifier le .bat et transformer "%1" en "%1"%*

  20. #20
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Il me semble aussi que tu teste hors contexte.

    Regarde cette partie du code :

    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
    Arguments = ''
    if len(argv) < 2:
        print 'Usage:'
        print 'python <nomduscript.py> <argumentsoptionnels>'
        print 'Ou pour un usage graphique:'
        print 'python v <nomduscript.py> <argumentsoptionnels>'
        quit()
    elif len(argv) == 2:
        filename=argv[1]
    else:
        if argv[1].lower() == 'v':
            filename=argv[2]
            listeargs = 3
        else:
            filename=argv[1]
            listeargs = 2
        while listeargs < len(argv):
            Arguments = Arguments + ' ' + argv[listeargs]
            listeargs = listeargs + 1
    @+
    Merci d'utiliser le forum pour les questions techniques.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Quelles versions d'Access utilisez-vous en 2009 ?
    Par Maxence HUBICHE dans le forum Sondages et Débats
    Réponses: 16
    Dernier message: 19/05/2016, 18h17
  2. quelle version de SciPy pour Python 2.6.2?
    Par billyrose dans le forum Déploiement/Installation
    Réponses: 3
    Dernier message: 21/05/2009, 21h35
  3. [Install] Quelle version d'Eclipse choisir
    Par yassine_23 dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 13/05/2004, 16h57
  4. Quelle version de Postgresql pour mandrake 9.0 ?
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 09/03/2004, 11h45
  5. [JBuilder][Web Services] à partir de quelle version?
    Par sicard_51 dans le forum JBuilder
    Réponses: 2
    Dernier message: 25/08/2003, 13h54

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