Come eseguo un programma da Python? os.system non riesce a causa di spazi nel percorso
-
03-07-2019 - |
Domanda
Ho uno script Python che deve eseguire un programma esterno, ma per qualche ragione fallisce.
Se ho il seguente script:
import os;
os.system("C:\\Temp\\a b c\\Notepad.exe");
raw_input();
Quindi fallisce con il seguente errore:
'C: \ Temp \ a' non è riconosciuto come comando interno o esterno, programma eseguibile o file batch.
Se sfuggo al programma con le virgolette:
import os;
os.system('"C:\\Temp\\a b c\\Notepad.exe"');
raw_input();
Quindi 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 attendere che venga completato? Non ho bisogno di leggere l'output da esso, poiché è un programma visivo che fa un lavoro e poi esce, ma devo aspettare che venga completato.
Nota anche che lo spostamento del programma su un percorso non spaziato non è un'opzione.
Neanche questo funziona:
import os;
os.system("'C:\\Temp\\a b c\\Notepad.exe'");
raw_input();
Nota le virgolette singole / doppie scambiate.
Con o senza un parametro per Blocco note qui, non riesce con il messaggio di errore
La sintassi del nome file, del nome della directory o dell'etichetta del volume non è corretta.
Soluzione
subprocess.call
eviterà problemi di dover fare i conti con le convenzioni di quotazione di varie conchiglie. Accetta un elenco, anziché una stringa, quindi gli argomenti vengono delimitati più facilmente. cioè.
import subprocess
subprocess.call(['C:\\Temp\\a b c\\Notepad.exe', 'C:\\test.txt'])
Altri suggerimenti
Ecco un modo diverso di farlo.
Se stai usando Windows, il seguente si comporta come un doppio clic sul file in Explorer, o dando il nome del file come argomento alla quot & DOS; start " comando: il file viene aperto con qualunque applicazione (se presente) è associata alla sua estensione.
filepath = 'textfile.txt'
import os
os.startfile(filepath)
Esempio:
import os
os.startfile('textfile.txt')
Questo aprirà textfile.txt con Blocco note se Blocco note è associato a file .txt.
Le citazioni più esterne sono consumate dallo stesso Python e la shell di Windows non lo vede. Come accennato in precedenza, Windows comprende solo virgolette. Python converte la barra rovesciata in barre rovesciate su Windows, quindi puoi usare
os.system('"C://Temp/a b c/Notepad.exe"')
Il 'è consumato da Python, che quindi passa " C: // Temp / a b c / Notepad.exe " (come percorso Windows, non sono necessarie doppie barre rovesciate) su CMD.EXE
Almeno in Windows 7 e Python 3.1, os.system
in Windows desidera la riga di comando tra virgolette doppie se sono presenti spazi nel percorso del comando. Ad esempio:
TheCommand = '\"\"C:\\Temp\\a b c\\Notepad.exe\"\"'
os.system(TheCommand)
Un esempio del mondo reale che mi stordiva era la clonazione di un'unità in VirtualBox. La subprocess.call
soluzione sopra non ha funzionato a causa di un problema relativo ai diritti di accesso, ma quando ho citato due volte il comando, <=> è diventato felice:
TheCommand = '\"\"C:\\Program Files\\Sun\\VirtualBox\\VBoxManage.exe\" ' \
+ ' clonehd \"' + OrigFile + '\" \"' + NewFile + '\"\"'
os.system(TheCommand)
import win32api # if active state python is installed or install pywin32 package seperately
try: win32api.WinExec('NOTEPAD.exe') # Works seamlessly
except: pass
Sospetto che sia lo stesso problema di quando si utilizzano le scorciatoie in Windows ... Prova questo:
import os;
os.system("\"C:\\Temp\\a b c\\Notepad.exe\" C:\\test.txt");
Per python > = 3.5 subprocess.run
dovrebbe essere usato al posto di subprocess.call
https://docs.python.org /3/library/subprocess.html#older-high-level-api
import subprocess
subprocess.run(['notepad.exe', 'test.txt'])
Supponiamo di voler eseguire il tuo server web Django (in Linux) che ci sia spazio tra il tuo percorso (path = '/home/<you>/<first-path-section> <second-path-section>'
), quindi procedi come segue:
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_)
[ Nota ]:
- Non dimenticare di accedere all'autorizzazione:
chmod 755 -R <'yor path'>
-
manage.py
è eccezionale:chmod +x manage.py