2009-12-04 6 views
0

NOTE: Ceci est pas la même question que Python: Persistent shell variables in subprocess, comme cette question est en fait sur les variables d'environnement, pas de variables shell.Comment définir les variables shell dans subprocess.Popen (d'une manière moins laide ...)

Je suis en train d'automatiser une référence de base que je fais en utilisant le shell csh commande intégrée 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 subprocess.Popen (j'ai essayé ça en premier ...). Vous pouvez 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 semble pas vraiment la bonne voie à suivre (et peut conduire à une construction horrible cmd lorsque vous voulez modifier un tas de différents comportements de shell).

Y at-il une autre façon de définir des variables shell dans subprocess autre que cette bidouille?

Répondre

1

Vous avez un nombre limité d'options pour communiquer à un processus enfant (arguments d'appel, l'environnement, et cours d'eau). Puisque la définition d'une variable shell est dans un sens plus général, modifiant l'état interne d'un processus enfant, ce que vous appelez un "kludge" est en fait assez raisonnable. Je ne connais pas de variantes de csh qui ont un moyen spécial de charger les variables shell. Cependant, vous pouvez le récupérer en écrivant toutes vos commandes d'initialisation dans le shell via un tube, ou même en les écrivant dans un fichier et en les faisant lire par le source intégré de csh.

+0

C'est probablement un bon moyen de le regarder (malheureusement). Alors que la plupart des shells semblent avoir des variables shell, leur comportement n'est certainement pas gouverné par POSIX comme le sont les variables d'environnement. Malheureusement, je n'ai pas trouvé la bonne sauce magique pour communiquer avec un véritable * shell * via un tuyau. Cela ressemble plus à un travail pour pyexpect ou personnalisé tty munging, qui sont moins attrayants que ma solution existante. :-) –

Questions connexes