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 :

os.system et espaces dans le chemin


Sujet :

Python

  1. #1
    Membre éprouvé Avatar de kazhar
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut os.system et espaces dans le chemin
    Bonjour,

    Travaillant avec Python et PyUNO, je tente de lancer le serveur via mon script si celui-ci ne l'est pas déjà.

    Je fais donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system('soffice -accept="socket,host=localhost,port=2002;urp;"'
    Cependant bien que j'ai placé le dossier approprié dans mon path, il ne trouve pas soffice.

    J'ai donc voulu naivement tester un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system('C:/Program Files/OpenOffice.org 3/program/soffice -accept="socket,host=localhost,port=2002;urp;"')
    Mais la du coup il dit qu'il ne trouve pas C:/Program.

    Du coup me vient la question : comment puis-je placer des espaces dans mon path ?

  2. #2
    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
    bonjour,

    tu peux essayer comme ça ?:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system(r'C:/Program Files/OpenOffice.org 3/program/soffice -accept="socket,host=localhost,port=2002;urp;"')

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Ce n'est pas vraiment une question de Python, il te suffit d'entourer le chemin de l'exécutable par des guillemets doubles (")

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Pourquoi des guillemets doubles ?
    D'ailleurs, il s'agit bien de " et pas deux fois ' , n'est ce pas ?

  5. #5
    Membre éprouvé Avatar de kazhar
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    Sauf que cela ne fonctionne pas.
    Que je fasse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    status = os.system('"'+oo_path+'" "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -nologo -headless -nofirststartwizard')
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    status = os.system(r'C:/Program Files/OpenOffice.org 3/program/soffice "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -nologo -headless -nofirststartwizard')
    J'ai toujours la même erreur
    'C:/Program' n'est pas reconnu en tant que commande interne ou externe, un programme exécutable ou un fichier de commande.

  6. #6
    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,

    L'argument ne doit pas être seulement une chaine, mais une chaine avec ses guillemets. On peut donc utiliser les guillemets entourés par les apostrophes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os.system('"C:/Program Files/ConTEXT/ConTEXT.exe"')
    Et cela lance l'excellent éditeur de texte context.

    Tyrtamos

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Je suis un ignare concernant le module os, que ce soit clair.
    Mais je lis dans la docu
    system( command)
    Execute the command (a string) in a subshell.
    Je me dis donc qu'il faut que le string spécifie une commande.
    Or je doute qu'un chemin soit une commande en lui-même......
    Mais bon: GOTO line 1.

  8. #8
    Membre éprouvé Avatar de kazhar
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    Oui, je l'avais compris. C'est ce que j'ai dans la chaine plus haut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    status = os.system('"'+oo_path+'" "-accept=socket,host=localhost,port=8100;urp;StarOffice.ServiceManager" -nologo -headless -nofirststartwizard')
    Ou oo_path contient le chemin vers l'exécutable. Mais cela ne change rien.

    et, soi dit en passant l'exécution de la ligne de code donnée par tyrtamos dans le message précédent ne change rien non plus.

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Tu es sous quel système d'exploitation ?

  10. #10
    Membre éprouvé Avatar de kazhar
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Par défaut
    XP.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Bon. Je demandais parce que dans la doc sur system() j'ai vu:
    Availability: Macintosh, Unix, Windows.


    Je lis aussi
    system()
    This is implemented by calling the Standard C function system, and has the same limitations.


    Et encore
    The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function. Use the subprocess module. Check especially the Replacing Older Functions with the subprocess Module section.


    Je lis aussi
    Since different operating systems have different path name conventions, there are several versions of this module in the standard library. The os.path module is always the path module suitable for the operating system Python is running on, and therefore usable for local paths. However, you can also import and use the individual modules if you want to manipulate a path that is always in one of the different formats. They all have the same interface:

    posixpath for UNIX-style paths
    ntpath for Windows paths
    macpath for old-style MacOS paths
    os2emxpath for OS/2 EMX paths

    http://docs.python.org/library/os.path.html

  12. #12
    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
    Regarde s'il n'y aurait pas un problème avec les arguments.

    En effets, dans la console DOS, on arrive à lancer openoffice avec (les guillemets font partie de la commande!):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C:\Python25\Pydev\test>"C:\Program Files\OpenOffice.org 3\program\soffice.exe"
    Et sous python:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os.system('"C:\Program Files\OpenOffice.org 3\program\soffice.exe"')
    On voit bien d'ailleurs que les guillemets sont destinés à DOS et pas à Python.

    Par contre, ni l'un ni l'autre, ni même avec subprocess.popen(), ne marche avec tes arguments. Si les arguments étaient ok, ça devrait au moins marcher avec la console DOS.

    Tyrtamos

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut
    Et pourquoi ne pas utiliser startfile( path[, operation]) si os.system() ne marche pas ?

    Et ayant lu l'astucieux conseil de tyrtamos qui m'a alerté,
    avant d'essayer startfile() , essayer de voir si le chemin est correct avec cette fonction que je vois décrite dans sa docu :
    « Use the os.path.normpath() function to ensure that the path is properly encoded for Win32 »

  14. #14
    Membre éprouvé

    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
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os.system('"C:/Program Files/ConTEXT/ConTEXT.exe"')
    Voici une bonne pratique pour les chemins (normalement c'est multi-os):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system(os.path.join('C:', 'Program Files', 'ConTEXT', 'ConTEXT.exe'))

  15. #15
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2002
    Messages : 309
    Par défaut
    Sur une machine XP.
    J'ai testé la proposition de Tyrtamos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system('"C:\Program Files\OpenOffice.org 3\program\soffice.exe"')
    Elle marche très bien

    Alors que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system(os.path.join('C:', 'Program Files', 'ConTEXT', 'ConTEXT.exe'))
    Ne marche pas pour ce cas précis, car elle renvois un chemin à la python et non la DOS. a savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'C:\\Program Files\\ConTEXT\\ConTEXT.exe'
    alors que l'on attend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program Files\ConTEXT\ConTEXT.exe"

  16. #16
    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
    Je n'ai pas trouvé non plus pour que os.path.join n'interprète pas la chaine.

    Mais il y a tout de même une solution multiplate-forme qui marche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chemin = '"' + 'C:' + os.sep + 'Program Files' + os.sep + 'ConTEXT' + os.sep + 'ConTEXT.exe' + '"'
    os.system(chemin)
    A noter qu'il ne faut pas oublier les guillemets qui ne sont pas destinés à Python mais à la console!

  17. #17
    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
    Petit complément au message précédent: fonction qui simule os.path.join mais sans interpréter la chaine:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    import os
     
    def ospathjoin(*x):
        ch = ""
        if x!=[]:
            ch += x[0]
            for i in xrange(1,len(x)):
                ch += os.sep + x[i]
        return ch
    Avec cette fonction, le code suivant marche, c'est à dire appelle l'éditeur context:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chemin = '"' + ospathjoin('C:', 'Program Files', 'ConTEXT', 'ConTEXT.exe') + '"'
    os.system(chemin)
    Edit: petite rectif de code: mettre len(x)>0 au lieu de x!=[]

  18. #18
    Membre éprouvé

    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
    Par défaut
    Citation Envoyé par Gamal le Celte Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.system(os.path.join('C:', 'Program Files', 'ConTEXT', 'ConTEXT.exe'))
    Ne marche pas pour ce cas précis, car elle renvois un chemin à la python et non la DOS. a savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'C:\\Program Files\\ConTEXT\\ConTEXT.exe'
    alors que l'on attend :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program Files\ConTEXT\ConTEXT.exe"
    Oups c'est une erreur de ma part. Voici comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    import os
    print '"' + os.path.join('C:\\', 'Program Files', 'ConTEXT', 'ConTEXT.exe') + '"'
    # 'C:\\' est obligatoire car os ne gère pas les deux points.
    Le code ci-dessus renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "C:\Program Files\ConTEXT\ConTEXT.exe"

Discussions similaires

  1. Problème d'espace dans un chemin
    Par kalyparker dans le forum Langage
    Réponses: 15
    Dernier message: 23/08/2007, 10h18
  2. SQLPlus et espace dans un chemin d'accès
    Par jleg dans le forum Sql*Plus
    Réponses: 2
    Dernier message: 22/03/2007, 17h33
  3. Espace dans les chemins en batch
    Par pzou dans le forum Windows
    Réponses: 9
    Dernier message: 25/08/2006, 20h09
  4. [VBS] Gestion des espaces dans le chemin de fichiers
    Par Edoxituz dans le forum VBScript
    Réponses: 4
    Dernier message: 23/02/2006, 16h41
  5. [DOS] Espace dans le chemin et lancement de fichier
    Par nahzhir dans le forum Scripts/Batch
    Réponses: 16
    Dernier message: 20/02/2006, 09h27

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