Comment définir des variables shell dans subprocess.Popen (de manière moins laid ...)
-
12-09-2019 - |
Question
NOTE: Ceci est pas la même question que Python :. variables shell persistants , comme subprocess cette question est en fait de variables d'environnement, pas les variables shell
Je suis en train d'automatiser une référence de base que je fais en utilisant le shell csh intégré commande time
. Vous pouvez modifier la sortie de time
en définissant la variable du même nom dans la coquille comme suit:
set time=(1000000000 "%U %S %E %P %W %X %D %K %M %F %R %I %O %r %s %k %w %c")
Cependant, cela est bien sûr pas une variable d'environnement, de sorte que vous ne pouvez pas passer dans le paramètre env
dans le constructeur de subprocess.Popen
(j'ai essayé en premier ...). Vous peut pirater ensemble en abusant (imo, de toute façon) l'argument cmd
de le faire, et puis votre travail réel (raccourci pour afficher bien):
time_cmd = 'set time=(1000000000 "%U %S %E %P %c"); time ./some_func'
p = subprocess.Popen(cmd, executable="/bin/csh", shell=True, ...)
et qui fonctionne comme on peut s'y attendre, mais il ne semble pas vraiment la bonne façon d'aller (et peut conduire à une construction de cmd
assez horrible quand vous voulez modifier un tas de différents comportements shell).
Y at-il une autre façon de définir des variables shell dans subprocess
autres que ce bidouille?
La solution
Vous avez un nombre limité d'options pour communiquer à un processus enfant (arguments d'appel, l'environnement, et cours d'eau). Depuis la mise en une variable shell est dans un sens plus général de modifier l'état interne d'un processus enfant, ce que vous appelez un « bidouille » est en fait tout à fait raisonnable. Je ne connais pas toutes les variantes csh qui ont une manière particulière de charger des variables shell.
Cependant, vous pouvez neaten il par écrit toutes vos commandes d'initialisation à la coque par un tuyau ou en les écrivant même dans un fichier et les avoir lus par source
csh de builtin.