Comment puis-je exécuter un programme à partir de Python? OS.le système échoue en raison des espaces dans le chemin

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();

, Alors il échoue avec l'erreur suivante:

'C:Tempa' n'est pas reconnu comme une commande interne ou externe, un programme opérable ou un fichier batch.

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 cesse de fonctionner à nouveau:

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

Qu'est-ce que le bonne façon d'exécuter un programme et d'attendre qu'elle se termine? Je n'ai pas besoin de lire la sortie, car c'est un programme visuel qui fait un travail et se termine juste, mais je dois attendre qu'il se termine.

Notez également que déplacer le programme vers un chemin Non espacé n'est pas non plus une option.


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 pour le bloc-notes ici, il échoue avec le message d'erreur

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

233
demandé sur Peter Mortensen 2008-10-15 12:24:28

8 réponses

subprocess.call permettra d'éviter les problèmes d'avoir à traiter avec les conventions de citation de divers coquilles. Il accepte une liste, plutôt qu'une chaîne, donc 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'])
256
répondu Brian 2012-12-19 12:07:39

Voici une autre façon de le faire.

Si vous utilisez Windows, les actions suivantes consistent à double-cliquer sur le fichier dans L'Explorateur ou à donner le nom du fichier comme argument à la commande DOS "start": le fichier est ouvert avec n'importe quelle application (le cas échéant) à laquelle son extension est associée.

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

Exemple:

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

Cela ouvrira textfile.txt avec bloc-notes si le Bloc-Notes est associé à .les fichiers txt.

58
répondu user16738 2018-01-17 20:24:23

Les guillemets les plus externes sont consommés par Python lui-même, et le shell Windows ne le voit pas. Comme mentionné ci-dessus, Windows ne comprend que les guillemets doubles. Python convertira les barres obliques en barres obliques inverses sous Windows, vous pouvez donc utiliser

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

LE ' est consommé par Python, qui passe ensuite "C://Temp/a b C / Bloc-notes.exe " (en tant que chemin Windows, Pas de double barre oblique inverse nécessaire) à CMD.EXE

31
répondu Daniel Serodio 2015-06-28 19:01:00

Au moins dans Windows 7 et python 3.1, os.system dans Windows veut la ligne de commande entre guillemets doubles 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 me dérangeait é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 quand j'AI Double-cité la commande, os.system est devenu heureux:

  TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
                 + ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
  os.system(TheCommand)
16
répondu Paul Hoffman 2016-10-21 16:36:43
import win32api # if active state python is installed or install pywin32 package seperately

try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
7
répondu rahul 2012-03-27 22:23:22

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
répondu Matthew Scharley 2008-10-15 09:16:54

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'])
2
répondu gbonetti 2018-01-22 13:16:24

Supposons que nous voulons exécuter votre serveur web Django (sous Linux) qu'il y ait de l'espace entre votre chemin (path='/home/<you>/<first-path-section> <second-path-section>'), procédez comme suit:

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_)

[Note]:

  • N'oubliez pas d'accéder à l'autorisation: chmod 755 -R <'yor path'>
  • manage.py est exceutable: chmod +x manage.py
0
répondu Benyamin Jafari 2018-09-20 19:54:10