Come eseguo un programma da Python? os.system non riesce a causa di spazi nel percorso

StackOverflow https://stackoverflow.com/questions/204017

  •  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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top