How to source script via python
Question: I can source bash script (without shebang) easy as bash command in terminal
but trying to do the same via python command

    
    
    sourcevars = "cd /etc/openvpn/easy-rsa && . ./vars"
    runSourcevars = subprocess.Popen(sourcevars, shell = True)
    

or

    
    
    sourcevars = [". /etc/openvpn/easy-rsa/vars"]
    runSourcevars = subprocess.Popen(sourcevars, shell = True)
    

I receive :

> Please source the vars script first (i.e. "source ./vars") Make sure you
> have edited it to reflect your configuration.

What's the matter, how to do it correctly?I've read some topics here,e.g
[here](http://stackoverflow.com/q/7040592/407651) but could not solve my
problem using given advices. Please explain with examples.

UPDATED:

    
    
    # os.chdir = ('/etc/openvpn/easy-rsa')
    initvars = "cd /etc/openvpn/easy-rsa && . ./vars && ./easy-rsa ..."
    
    
    # initvars = "cd /etc/openvpn/easy-rsa && . ./vars"
    # initvars = [". /etc/openvpn/easy-rsa/vars"]
    cleanall = ["/etc/openvpn/easy-rsa/clean-all"]
    # buildca  = ["printf '\n\n\n\n\n\n\n\n\n' | /etc/openvpn/easy-rsa/build-ca"]
    # buildkey = ["printf '\n\n\n\n\n\n\n\n\n\nyes\n ' | /etc/openvpn/easy-rsa/build-key AAAAAA"]
    # buildca  = "cd /etc/openvpn/easy-rsa && printf '\n\n\n\n\n\n\n\n\n' | ./build-ca"
    runInitvars = subprocess.Popen(cmd, shell = True)
    # runInitvars = subprocess.Popen(initvars,stdout=subprocess.PIPE, shell = True, executable="/bin/bash")
    runCleanall = subprocess.Popen(cleanall , shell=True)
    
    # runBuildca = subprocess.Popen(buildca , shell=True)
    # runBuildca.communicate()
    # runBuildKey = subprocess.Popen(buildkey, shell=True )
    

UPDATE 2

    
    
    buildca  = ["printf '\n\n\n\n\n\n\n\n\n' | /etc/openvpn/easy-rsa/build-ca"]
    runcommands = subprocess.Popen(initvars+cleanall+buildca, shell = True)
    


Answer: There's absolutely nothing wrong with this in and of itself:

    
    
    # What you're already doing -- this is actually fine!
    sourcevars = "cd /etc/openvpn/easy-rsa && . ./vars"
    runSourcevars = subprocess.Popen(sourcevars, shell=True)
    
    # ...*however*, it won't have any effect at all on this:
    runOther = subprocess.Popen('./easy-rsa build-key yadda yadda', shell=True)
    

However, if you **subsequently** try to run a second `subprocess.Popen(...,
shell=True)` command, you'll see that it doesn't have any of the variables set
by sourcing that configuration.

**This is entirely normal and expected behavior** : The entire point of using
`source` is to modify the state of the active shell; each time you create a
new `Popen` object with `shell=True`, it's starting a new shell -- their state
isn't carried over.

Thus, combine into a single call:

    
    
    prefix = "cd /etc/openvpn/easy-rsa && . ./vars && "
    cmd = "/etc/openvpn/easy-rsa/clean-all"
    runCmd = subprocess.Popen(prefix + cmd, shell=True)
    

...such that you're using the results of sourcing the script in the same shell
invocation as that in which you actually source the script.

* * *

Alternately (and this is what I'd do), require your Python script to be
invoked by a shell which already has the necessary variables in its
environment. Thus:

    
    
    # ask your users to do this
    set -a; . ./vars; ./yourPythonScript
    

...and you can error out if people don't do so very easy:

    
    
    import os, sys
    if not 'EASY_RSA' in os.environ:
        print >>sys.stderr, "ERROR: Source vars before running this script"
        sys.exit(1)
    

