Hoe voer ik een programma uit vanuit Python? os.system faalt vanwege spaties in pad

Ik heb een Python script dat een extern programma moet uitvoeren, maar om een of andere reden mislukt dat.

Als ik het volgende script heb:

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

Dan mislukt het met de volgende foutmelding:

'C:\Temp' wordt niet herkend als een intern of extern commando, operabel programma of batchbestand.

Als ik het programma escapeer met aanhalingstekens:

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

Dan werkt het. Echter, als ik een parameter toevoeg, stopt het weer met werken:

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

Wat is de juiste manier om een programma uit te voeren en te wachten tot het klaar is? Ik hoef er geen uitvoer van te lezen, omdat het een visueel programma is dat een taak uitvoert en dan gewoon afsluit, maar ik moet wachten tot het voltooid is.

Ook het verplaatsen van het programma naar een niet-gespaced pad is geen optie.


Dit werkt ook niet:

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

Let op de verwisselde enkele/dubbele aanhalingstekens.

Met of zonder een parameter aan Notepad hier, het mislukt met de foutmelding

De syntaxis van de bestandsnaam, mapnaam of volumenaam is onjuist.

Oplossing

subprocess.call zal problemen voorkomen met het moeten omgaan met de aanhalingstekens van verschillende shells. Het accepteert een lijst, in plaats van een string, zodat argumenten eenvoudiger te scheiden zijn. d.w.z.

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

Hier's een andere manier om het te doen.

Als je'Windows gebruikt werkt het volgende als dubbelklikken op het bestand in Verkenner, of de bestandsnaam als argument geven aan het DOS "start" commando: het bestand wordt geopend met welke toepassing (indien aanwezig) zijn extensie ook is geassocieerd.

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

Voorbeeld:

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

Dit zal textfile.txt openen met Notepad als Notepad geassocieerd is met .txt bestanden.

Commentaren (3)

Ik vermoed dat het hetzelfde probleem is als wanneer je sneltoetsen in Windows gebruikt... Probeer dit eens:

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