How to set environment variables of parent shell in Python?
Solution 1
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?
Solution 2
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
ewok
Software engineer in the Greater Boston Area. Primary areas of expertise include Java, Python, web-dev, and general OOP, though I have dabbled in many other technologies.
Updated on June 29, 2022Comments
-
ewok almost 2 years
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?
-
Charles Duffy over 4 yearsUsing backticks to run the expansion result is buggy for all the reasons given in BashFAQ #50; if you want to treat a string as code for a shell, use
eval
after taking steps (like use of theshlex.quote()
/pipes.quote()
functions) to ensure it's safe to process in that way. (The better practice is to pass an array out of your shell script and evaluate it as a simple command, but that's a mouthful and notes on doing it right don't fit into a comment, at least, not with a full explanation of why the associated complexity is called for).