web-dev-qa-db-fra.com

Comment exécuter un programme depuis Python? os.system échoue à cause d'espaces dans le chemin

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

Si j'ai le script suivant:

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

Ensuite, il échoue avec l'erreur suivante:

'C:\Temp\a' n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes.

Si j'échappe au programme avec des guillemets:

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

Alors ça marche. Cependant, si j'ajoute un paramètre, il ne fonctionne plus:

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'il se termine? Je n'ai pas besoin de lire le résultat, car il s'agit d'un programme visuel qui effectue un travail puis se termine, mais je dois attendre qu'il soit terminé.

Notez également que le déplacement du programme vers un chemin non espacé n’est pas une option non plus.


Cela ne fonctionne pas non plus:

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

Notez les guillemets simples/doubles échangés.

Avec ou sans paramètre à Notepad ici, il échoue avec le message d'erreur

Le nom du fichier, le nom du répertoire ou la syntaxe de l'étiquette du volume est incorrecte.

241

subprocess.call évitera les problèmes liés aux conventions de citation de divers obus. Il accepte une liste plutôt qu'une chaîne, de sorte que les arguments sont plus facilement délimités. c'est à dire.

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

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

Si vous utilisez Windows, procédez comme suit: double-cliquez sur le fichier dans l'explorateur ou attribuez le nom du fichier à la commande "start" du DOS: le fichier est ouvert avec l'application (le cas échéant) associée à l'extension .

filepath = 'textfile.txt'
import os
os.startfile(filepath)

Exemple:

import os
os.startfile('textfile.txt')

Cela ouvrira textfile.txt avec Notepad si Notepad est associé à des fichiers .txt.

60
user16738

Les citations les plus externes sont utilisées par Python lui-même et Windows Shell ne les voit pas. Comme mentionné ci-dessus, Windows ne comprend que les guillemets doubles. Python convertira les barres obliques inverses sous Windows afin que vous puissiez utiliser

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

Le 'est consommé par Python, qui passe ensuite "C: // Temp/a b c/Notepad.exe" (en tant que chemin Windows, aucune double barre oblique inverse n'est nécessaire) à CMD.EXE

32
Daniel Serodio

Au moins dans Windows 7 et Python 3.1, os.system dans Windows veut la ligne de commande guillemets doubles s'il existe 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 concret qui me bloquait était le clonage d'un lecteur dans VirtualBox. La solution subprocess.call ci-dessus n'a pas fonctionné à cause d'un problème de droits d'accès, mais lorsque j'ai double guidé la commande, os.system est devenu heureux:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)
17
Paul Hoffman
import win32api # if active state python is installed or install pywin32 package seperately

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

Je soupçonne que c'est le même problème que lorsque vous utilisez des raccourcis dans Windows ... Essayez ceci:

import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
4
Matthew Scharley

Pour python> = 3.5, subprocess.run doit être utilisé à la place de subprocess.call

https://docs.python.org/3/library/subprocess.html#older-high-level-api

import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
3
gbonetti

Supposons que nous voulions utiliser votre serveur Web Django (sous Linux) pour qu'il y ait un espace entre votre chemin (chemin = '/home/<you>/<first-path-section> <second-path-section>').

import subprocess

args = ['{}/manage.py'.format('/home/<you>/<first-path-section> <second-path-section>'), 'runserver']
res = subprocess.Popen(args, stdout=subprocess.PIPE)
output, error_ = res.communicate()

if not error_:
    print(output)
else:
    print(error_)

[ Remarque ]: 

  • N'oubliez pas la permission d'accès: chmod 755 -R <'yor path'>
  • manage.py est remplaçable: chmod +x manage.py
0
Benyamin Jafari

Pour Python 3.7, utilisez subprocess.call . Utilisez une chaîne brute pour simplifier les chemins Windows:

import subprocess
subprocess.call([r'C:\Temp\Example\Notepad.exe', 'C:\test.txt'])
0
WestAce