Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set environment variables of parent shell in Python? [duplicate]

I'm trying to modify the environment variables on a parent shell from within Python. What I've attempted so far hasn't worked:

~ $ export TESTING=test
~ $ echo $TESTING
test
~ $
~ $
~ $ python
Python 2.7.10 (default, Jun  1 2015, 18:05:38)
[GCC 4.9.2] on cygwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['TESTING']
'test'
>>> os.environ['TESTING'] = 'changed'
>>> os.environ['TESTING']
'changed'
>>> quit()
~ $
~ $
~ $ echo $TESTING
test

That's all I've been able to come up with. Can it be done? How do I set environment variables of parent shell in Python?

like image 761
ewok Avatar asked Mar 03 '16 18:03

ewok


2 Answers

This isn't possible.

Child processes inherit their environments from their parents rather than share them. Therefore any modifications you make to your environment will be reflected only in the child (python) process. Practically, you're just overwriting the dictionary the os module has created based on your environment of your shell, not the actual environment variables of your shell.

https://askubuntu.com/questions/389683/how-we-can-change-linux-environment-variable-in-python

Why can't environmental variables set in python persist?

like image 51
DaveBensonPhillips Avatar answered Dec 11 '22 15:12

DaveBensonPhillips


What you can do is to parse the output of a Python command as shell commands, by using the shell's Command Substitution functionality, which is more often used to evaluate a command in-line of another command. E.g. chown `id -u` /somedir.

In your case, you need to print shell commands to stdout, which will be evaluated by the shell. Create your Python script and add:

testing = 'changed'
print 'export TESTING={testing}'.format(testing=testing)

then from your shell:

$ `python my_python.sh`
$ echo TESTING
changed

Basically, any string will be interpreted by the shell, even ls, rm etc

like image 37
Alastair McCormack Avatar answered Dec 11 '22 17:12

Alastair McCormack