Skip to content

Instantly share code, notes, and snippets.

@vlasovskikh
Created April 3, 2014 14:33
Show Gist options
  • Save vlasovskikh/e8fe8e0a5c4a73048a09 to your computer and use it in GitHub Desktop.
Save vlasovskikh/e8fe8e0a5c4a73048a09 to your computer and use it in GitHub Desktop.
Source Bash file using a Python function
import os
from subprocess import Popen, PIPE
import pickle
PYTHON_DUMP_ENVIRON = """\
import sys
import os
import pickle
data = pickle.dumps(os.environ)
stdout = os.fdopen(sys.stdout.fileno(), "wb")
stdout.write(data)
"""
def source_bash_file(path):
bash_cmds = [
"source '%s'" % path,
"python -c '%s'" % PYTHON_DUMP_ENVIRON,
]
p = Popen(['bash', '-c', '&&'.join(bash_cmds)], stdout=PIPE)
stdout, _ = p.communicate()
if stdout:
environ = pickle.loads(stdout)
for k, v in environ.items():
os.environ[k] = v
@koffie
Copy link

koffie commented Nov 20, 2021

Thanks for this gist! I had to modify line 11 in a more recent version of python to:

data = pickle.dumps(dict(os.environ))

in order to make it work. Apparently os.environ is now wrapped in a class that cannot be pickled.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment