Domanda

Attualmente sto riscontrando un grosso problema con uno script Python. Lo script esegue comandi arbitrari attraverso un gestore per convertire la segnalazione errori errata in segnalazione errori corretta.

Il problema che sto riscontrando è far funzionare correttamente lo script su Windows con un comando che contiene e commerciali nel suo percorso. Ho provato a citare il comando, sfuggendo alla e commerciale con ^ e nessuno dei due funziona. Ora sono senza idee. Qualche suggerimento?

Per chiarire dalle risposte attuali:

  1. Sto usando il modulo di sottoprocesso
  2. Sto passando la riga di comando + argomenti come un elenco
  3. Il problema riguarda il percorso del comando stesso, non nessuno degli argomenti
  4. Ho provato a citare il comando. Causa un [Errore 123] Il nome del file, il nome della directory o la sintassi dell'etichetta del volume non è corretto errore
  5. Non sto usando alcun argomento di shell (quindi shell = false )
  6. Nel caso in cui sia importante, sto afferrando una pipe a stderr per elaborarla, ma ignoro stdout e stdin
  7. Attualmente è solo per Windows e funziona come previsto in tutti gli altri casi che ho testato finora.
  8. Il comando che non riesce è:
  

p = subprocess.Popen (prog, stderr = subprocess.PIPE, bufsize = -1)

quando il primo elemento dell'elenco 'prog' contiene una e commerciale. Citando questa prima stringa non funziona.

È stato utile?

Soluzione

Assicurati di utilizzare elenchi e nessuna espansione della shell:

subprocess.Popen(['command', 'argument1', 'argument2'], shell=False)

Altri suggerimenti

Una risposta adeguata richiederà più informazioni di così. Che cosa stai facendo? Come fallisce? Stai utilizzando il modulo di sottoprocesso? Stai passando un elenco di argomenti e shell = False (o nessun argomento shell) o stai effettivamente invocando la shell?

Prova a citare l'argomento che contiene & amp;

wget "http://foo.com/?bar=baz&baz=bar"

Di solito è ciò che deve essere fatto in una shell Linux

" scappando dalla e commerciale con ^ "

Sei sicuro che ^ sia un carattere di escape per Windows? Non dovresti usare \ ?

Per rispondere alla mia domanda:

Citando il comando effettivo quando si passano i parametri come un elenco non funziona correttamente (il comando è il primo elemento dell'elenco), quindi per risolvere il problema ho trasformato l'elenco in una stringa separata dallo spazio e invece lo ho passato in sottoprocesso.

Sono ancora apprezzate soluzioni migliori.

Provo una situazione come segue:

exe = 'C:/Program Files (x86)/VideoLAN/VLC/VLC.exe'
url = 'http://translate.google.com/translate_tts?tl=en&q=hello+world'
subprocess.Popen([exe, url.replace("&","^&")],shell=True)

Questo funziona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top