301 votes

Comment puis-je exécuter un programme à partir de python? os.système échoue à cause des espaces dans le chemin d'accès

J'ai un script python qui doit exécuter un programme externe, mais pour une raison échoue.

Si j'ai le script suivant:

import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();

Puis il échoue avec l'erreur suivante:

'C:\Temp\a' is not recognized as an internal or external command, operable program or batch file.

Si j'ai échappé le programme avec des guillemets:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();

Puis il travaille. Cependant, si j'ajoute un paramètre, il s'arrête de fonctionner à nouveau:

import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();

Quelle est la bonne façon d'exécuter un programme et d'attendre qu'elle se termine? Je n'ai pas besoin de lire de sortie, comme elle est l'image d'un programme qui fait un travail et puis il suffit de sortie, mais j'ai besoin d'attendre qu'elle se termine.

À noter également, le déplacement le programme à un non-espacés chemin n'est pas une option non plus.


Modifier Ce qui ne fonctionne pas:

import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();

Remarque le échangé simple/double guillemets.

avec ou sans paramètre de bloc-notes ici, il échoue avec le message d'erreur

The filename, directory name, or volume label syntax is incorrect.

314voto

Brian Points 48423

subprocess.call permet d'éviter les problèmes avec le fait d'avoir à traiter avec citant conventions de divers coquillages. Il accepte une liste, plutôt qu'une chaîne, de sorte que les arguments sont plus facilement délimité. c'est à dire

import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])

85voto

user16738 Points 488

Voici une façon différente de le faire.

Si vous utilisez windows les actes suivants comme en double-cliquant sur le fichier dans l'Explorateur, ou en donnant le nom de fichier comme argument pour le DOS "démarrer" de la commande: le fichier est ouvert avec quelle application (le cas échéant), son extension est associée.

import os
os.startfile(filepath)

Exemple:

import os
os.startfile(textfile.txt)

Cela va ouvrir textfile.txt avec le bloc-notes si le bloc-notes est associted avec .les fichiers txt.

35voto

Daniel Serodio Points 287

Ultrapériphériques, les citations sont consommés par Python lui-même, et le shell Windows ne veut pas le voir. Comme mentionné ci-dessus, Windows ne reconnait que les doubles guillemets. Python permettra de convertir de l'avant-réduit de barres obliques inverses sur Windows, de sorte que vous pouvez utiliser

os.system('"C:/Temp/a b c/Notepad.exe"')

L' " est consommé par Python, qui les transmet alors "C:\Temp\a b c\Notepad.exe" (un chemin Windows, pas de double-barres obliques inverses besoin) CMD.EXE

20voto

Paul Hoffman Points 424

Au moins dans Windows 7 et Python 3.1, os.système de Windows veut de la ligne de commande entre guillemets s'il y a des espaces dans le chemin d'accès à la commande. Par exemple:

  TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
  os.system(TheCommand)

Un exemple réel qui a été estompe moi a été le clonage d'un disque dans Virtual box. Le processus secondaire.appel de la solution ci-dessus ne fonctionne pas en raison de certains droits d'accès de problème, mais lorsque je double-cité de la commande, le système d'exploitation.le système est devenu heureux:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)

11voto

rahul Points 67
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X