Come impostare variabili di shell a subprocess.Popen (in modo meno brutto ...)
-
12-09-2019 - |
Domanda
Nota: Questo è non la stessa domanda Python :. variabili di shell persistenti in sottoprocesso , come quella domanda è in realtà sulle variabili di ambiente, non shell variabili
Sto cercando di automatizzare un punto di riferimento di base che io sto facendo in csh utilizzando la shell comando integrato time
. È possibile modificare l'output di time
impostando la variabile con lo stesso nome nella shell come segue:
set time=(1000000000 "%U %S %E %P %W %X %D %K %M %F %R %I %O %r %s %k %w %c")
Tuttavia, questo non è ovviamente una variabile di ambiente, quindi non si può passare nel parametro env
nel costruttore subprocess.Popen
(ho provato prima ...). possono incidere insieme abusando (IMO, comunque) l'argomento cmd
per farlo, e poi il vostro lavoro effettivo (ridotto a visualizzare bene):
time_cmd = 'set time=(1000000000 "%U %S %E %P %c"); time ./some_func'
p = subprocess.Popen(cmd, executable="/bin/csh", shell=True, ...)
e che funziona come ci si aspetterebbe, ma non sembra davvero la strada giusta da percorrere (e può portare a qualche costruzione cmd
abbastanza orribile quando si desidera modificare una serie di comportamenti diversi di shell).
C'è un altro modo per impostare variabili di shell in subprocess
diversi dal presente ripiego?
Soluzione
Si dispone di un numero limitato di opzioni per comunicare con un processo figlio (argomenti invocazione, l'ambiente, e corsi d'acqua). Dal momento che l'impostazione di una variabile scocca è in un senso più generale modificando lo stato interno di un processo figlio, quello che si chiama un "ripiego" è in realtà abbastanza ragionevole. Non so di eventuali varianti CSH che hanno un modo speciale per caricare le variabili di shell.
Tuttavia, si potrebbe neaten in su, scrivendo tutti i comandi di inizializzazione alla shell tramite un tubo, o anche la scrittura in un file e averli letti da incorporato source
di csh.