6

Ho un piccolo script Python che genera un comando di Windows:Subtime Text 2 - non è possibile eseguire Windows comando con spazi e cita

def quoted(s): 
    return '"' + s + '"' 

import os 
path = 'C:\\Program Files\\SumatraPDF\\SumatraPDF.exe' 
params = ' -page 5 ' 
arg = 'D:\\Dropbox\\Final Term\\Final Draft.pdf' 
cmd = quoted(path) + params + quoted(arg) 
print cmd 
os.system(cmd) 

Questo non viene eseguito all'interno Sublime Text 2 (premendo Ctrl + B):

"C:\Program Files\SumatraPDF\SumatraPDF.exe" -page 5 "D:\Dropbox\Final Term\Final Draft.pdf" 
'C:\Program' is not recognized as an internal or external command, 
operable program or batch file. 
[Finished in 0.1s] 

ma funziona se copio e incollare manualmente il comando (emesso da questo script) in cmd.exe.

Come faccio a farlo funzionare?

+0

Vedi http://superuser.com/questions/279008/how-do-i-escape-spaces-in-command-line-in-windows-without-using-quotation-marks –

risposta

2

Questo è un problema con lo spazio nel percorso file (è un problema su Windows). os.system() apre una shell di comandi e questo comportamento è ereditato dalla shell dei comandi. Se apri una "casella DOS" e digiti lo stesso , otterrai gli stessi risultati: sono le shell dei comandi di Windows che richiedono la quotatura di percorsi con spazi incorporati. Dovresti usare un altro paio di virgolette.

+0

non ha capisci l'ultima frase - puoi spiegarci un po 'di più? – Bruce

+0

try: path = '"" C: \ Programmi \ SumatraPDF \ SumatraPDF.exe "' – chilliq

+0

Non funziona :(Il comando completo era:' "" C: \ Programmi \ SumatraPDF \ SumatraPDF.exe "" - pagina 5 "D: \ Dropbox \ Final Term \ Final Draft.pdf" ' – Bruce

1

Vedere this answer, La parte sublime è secondaria, ma da un interprete python, è possibile verificare che os.system funzionerà se si utilizzano doppi apici attorno all'intera stringa. Tuttavia, non hai bisogno di virgolette se usi Popen (è abbastanza intelligente da capirlo).

Per esempio

>>> cmd = '""C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe""' 
>>> os.system(cmd) 

o

>>> cmd = 'C:\Program Files (x86)\Adobe\Reader 11.0\Reader\AcroRd32.exe' 
>>> Popen(cmd) 

Tra l'altro, dal guardare i tuoi commenti, non raddoppiare citare il percorso, virgolette l'intero comando ""path to exe with spaces" "arg1" "arg2" "arg3"", e davvero don Abbiamo bisogno di tutte le citazioni interne, ma non faranno del male, il che significa che dovrebbe funzionare con ""path to exe with spaces arg1 arg2 arg3""

0

os.system è deprecato. La cosa giusta da fare è Wyrmwood del menzionato Popen, e per separare gli argomenti:

import subprocess 
subprocess.Popen([ 
    "C:\Program Files\SumatraPDF\SumatraPDF.exe", 
    "-page", "5", 
    "D:\Dropbox\Final Term\Final Draft.pdf" 
]) 

È quindi possibile costruire il vostro comando avendo una lista e .extend ing con i tuoi argomenti. È possibile aggiungere (+) sys.argv per prelevare dalla riga di comando e così via.


ci sono anche altre funzioni utili in subprocess che vi permetterà, per esempio, ottenere l'output di un comando (checkoutput). Probabilmente vuoi solo subprocess.call.

Se si utilizza semplicemente process = subprocess.Popen(...), prepararsi a chiamare process.wait() per impedire la chiusura anticipata.

1

Come altri hanno suggerito, il modulo subprocess è probabilmente la soluzione migliore.

Tuttavia, vale la pena notare che MS Windows fornisce ancora la traduzione del vecchio file 8.3 per la compatibilità con i vecchi programmi MS-DOS. Puoi trovare le traduzioni eseguendo dir /X in cmd.exe, che in genere indicherà che C:\Program Files può essere indicato come C:\Progra~1.

Nel tuo caso, il seguente ...

import os 
path = 'C:\\Progra~1\\SumatraPDF\\SumatraPDF.exe' 
params = ' -page 5 ' 
arg = 'D:\\Dropbox\\FinalT~1\\FinalD~1.pdf' 
cmd = path + params + arg 
print cmd 
os.system(cmd) 

... dovrebbe funzionare.

0

Questo sembra funzionare per me. Cita il percorso dell'eseguibile e quindi cita l'intera stringa.

def quoted(s): 
    return '"' + s + '"' 

import os 
path = "C:\\Program Files\\SumatraPDF\\SumatraPDF.exe" 
params = ' -page 5 ' 
arg = 'D:\\Dropbox\\Final Term\\Final Draft.pdf' 

cmd = quoted(quoted(path) + params + arg) 
print(cmd) 

os.system(cmd) 
Problemi correlati