Ho uno script Python che ha bisogno di eseguire un programma esterno, ma per qualche motivo non riesce.
Se ho il seguente script
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Allora fallisce con il seguente errore:
'C:Tempa' non è riconosciuto come comando interno o esterno, programma operativo o file batch.
Se faccio l'escape del programma con le virgolette:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Allora funziona. Tuttavia, se aggiungo un parametro, smette di funzionare di nuovo:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe" "C:\\test.txt"');
raw_input();
Qual è il modo giusto per eseguire un programma e aspettare che si completi? Non ho bisogno di leggere l'output da esso, poiché è un programma visuale che fa un lavoro e poi semplicemente esce, ma ho bisogno di aspettare che completi.
Notate anche che spostare il programma in un percorso non spaziato non è un'opzione.
Anche questo non funziona:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Notate le virgolette singole/doppie scambiate.
Con o senza un parametro a Notepad qui, fallisce con il messaggio di errore
La sintassi del nome del file, del nome della directory o dell'etichetta del volume non è corretta.
subprocess.call
eviterà i problemi di dover trattare con le convenzioni di citazione delle varie shell. Accetta una lista, piuttosto che una stringa, così gli argomenti sono più facilmente delimitati.
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
Ecco un modo diverso di farlo.
Se state usando Windows, ciò che segue si comporta come un doppio clic sul file in Explorer, o dando il nome del file come argomento al comando DOS "start": il file viene aperto con qualsiasi applicazione (se esiste) a cui è associata la sua estensione.
filepath = 'textfile.txt'
import os
os.startfile(filepath)
Esempio:
import os
os.startfile('textfile.txt')
Questo aprirà textfile.txt con Notepad se Notepad è associato ai file .txt.
Ho il sospetto che sia lo stesso problema di quando si usano le scorciatoie in Windows... Prova questo:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");