Comment obtenir PID via un processus secondaire.Popen à la coutume de la variable d'environnement?

À l'aide de Python, comment puis-je exécuter un sous-processus avec une modification de la variable d'environnement et d'obtenir son PID? Je suppose sous-processus.Popen() est sur la bonne voie...

Dans le shell (bash), je voudrais faire cela:

MY_ENV_VAR=value ./program_name arg1 arg2 etc &

Cela va program_name en arrière-plan, en passant "arg1" et "arg2" et le "etc", avec une modification de la variable d'environnement "MY_ENV_VAR" avec une valeur de "valeur". Le programme program_name nécessite la variable d'environnement MY_ENV_VAR à être fixé à la valeur correcte.

Comment faire l'équivalent chose en Python? J'ai absolument besoin de le PID du processus. (Mon intention est de garder le script python, l'exécution et la réalisation des vérifications sur certaines choses program_name est fait dans le temps, et j'ai besoin de l'ID de processus pour s'assurer qu'il est toujours en cours d'exécution.)

J'ai essayé:

proc = subprocess.Popen(['MY_ENV_VAR=value', './program_name', 'arg1', 'arg2', 'etc'])

Mais bien sûr, il attend le premier élément à être le programme, pas une variable d'environnement.

Aussi essayé:

environ = dict(os.environ)
environ['MY_ENV_VAR'] = 'value'
proc = subprocess.Popen(['./program_name', 'arg1', 'arg2', 'etc', env=environ])

Près, je suppose, mais pas de cigare. De même, ce:

environ = dict(os.environ)
environ['MY_ENV_VAR'] = 'value'
proc = subprocess.Popen(['echo', '$MY_ENV_VAR'], env=environ)

Cela fait écho à "$MY_ENV_VAR" littéralement, je suppose, parce que il n'y a pas de shell pour l'interpréter. Ok, alors je vais essayer ci-dessus, mais avec cette ligne à la place:

proc = subprocess.Popen(['echo', '$MY_ENV_VAR'], env=environ, shell=True)

Et c'est très bien et dandy, sauf que la valeur de l'écho est vide (n'existent apparemment). Et même si elle a fait un travail, je voudrais obtenir le PID du shell, et non le processus réel, je suis en train de lancer.

J'ai besoin de lancer un processus avec une mesure de la variable d'environnement et d'obtenir son PID (pas le PID du shell). Des idées?

Êtes-vous vraiment bien sûr vous avez besoin d'une coque pour votre utilisation dans le monde réel de cas? Vous en avez besoin pour l'écho de cas de test, c'est sûr, mais en général, on ne serait pas/ne devrait pas l'utiliser lors de l'appel de votre programme réel.
J'ai seulement besoin de la coque, dans la mesure où le paramètre de configuration/en passant la variable d'environnement pour que le processus continue. Si je n'ai pas besoin de la coquille, je préfère ne pas l'utiliser. (Mais je n'ai besoin de passer des arguments au programme et l'exécuter en arrière-plan.)
Les variables d'environnement qui sont passés à la sous-processus dans votre proc = subprocess.Popen(['echo', '$MY_ENV_VAR'], env=environ) exemple; que les sous-processus n'est pas simplement faire quelque chose pour vous montrer qu'ils sont, parce que l'écho ne regarde jamais à son environnement. Essayez subprocess.Popen(['env'], env=environ) à la place.
Oh pinaise! C'est tout. Vous et abarnet eu pour moi à la même époque.
Par ailleurs, si vous avez besoin du "réel" du programme PID lors de l'utilisation de shell=True (qui, encore une fois, vous ne devriez jamais utiliser à moins que vous vraiment savez ce que vous faites), vous pouvez le faire en ayant le script shell invoquer la commande finale avec exec. Pour cet exemple: exec echo "$MY_ENV_VAR"; ce faisant, il entraînera la commande echo pour remplacer le shell en cours d'exécution du processus, héritant de son PID.

OriginalL'auteur Matt | 2013-04-03