frnhr frnhr - 1 month ago 6
Python Question

Can I run a bash script in Python and keep any env variables it exports?

The title pretty much says it all..

Suppose I have a bash script:

#!/bin/bash

# do some magic here, perhaps fetch something with wget, and then:
if [ "$VAR1" = "foo" ]; then
export CASEVARA=1
fi
export CASEVARB=2

# and potentially many other vars...


How can I run this script from python and check what env variables were set. Ideally, I'd like to "reverse-inherit" them into the main environment that is running Python.

So that I can access them with

import os

# run the bash script somehow

print os.environ['CASEVARA']

Answer

Certainly! It just requires some hacks:

variables = subprocess.Popen(
    ["bash", "-c", "trap 'env' exit; source \"$1\" > /dev/null 2>&1",
       "_", "yourscript"],
    shell=False, stdout=subprocess.PIPE).communicate()[0]

This will run your unmodified script and give you all exported variables in the form foo=bar on different lines.

On supported OS (like GNU) you can trap 'env -0' exit to get \0 separated variables, to support multiline values.

Comments