6

In the Ubuntu bash shell, I can set the environment variable from the .env file by using command lines "source" (example: source $OCSSWROOT/OCSSW_bash.env).

But source is not a function in python. So, how to set an environment variable from the .env file in python?

'l2gen'is a command line program of SeaDAS which be supported by NASA for processing ocean satellite data. I can run it in the bash shell. now, the more program needs to be coded with python script and 'l2gen' is one of program.

But the environment variable needs to be set again in python script. According to the google search result, I fond some method to set the environment variable in python. But lacking information about the .env file.

in the Linux bash shell, I set the environment variable by vim and source:

    vim .profile
    export OCSSWROOT=[SeaDAS_install_dir]/ocssw (adding this in the profile 
                                                 file and then save/exit)
    source $OCSSWROOT/OCSSW_bash.env

where: SeaDAS_install_dir is the directory where I installed software SeaDAS.

I try to add the environment variable as following:

import subprocess
if __name__=='__main__':
     l2cmdtest = 'l2gen -h'
     new_env = os.environ.copy()
     new_env['OCSSWROOT'] = '/usr/local/seadas-7.5.3/ocssw'
     new_env['OCSSWROOT'] = 'OCSSWROOT/OCSSW_bash.env'
     eturnCodetest = subprocess.call(l2cmdtest, shell=True)

where: 'l2gen -h' is a program which can work in the bash shell.

executing python script, and then an error:

/bin/sh: 1: l2gen: not found
Mureinik
  • 297,002
  • 52
  • 306
  • 350
Kevin Lee
  • 89
  • 1
  • 1
  • 4
  • *`l2gen: not found`* seems like the real problem, not setting environmental variables. Maybe you should use the full path to `l2gen` in `l2cmdtest`. You can find the full pathname with [`command -v l2gen`](https://stackoverflow.com/q/592620/608639) in Bash shell. – jww Jun 10 '19 at 05:01

1 Answers1

7

The python-dotenv package can do the heavy lifting for you:

from dotenv import load_dotenv
load_dotenv(dotenv_path='OCSSW_bash.env')
Mureinik
  • 297,002
  • 52
  • 306
  • 350
  • thanks. But how to link an environment variable to .env file? – Kevin Lee Jun 11 '19 at 11:23
  • @KevinLee I'm not sure I understand the question. You edit the `.env` file with the variables you need (e.g., `MYVAR=123`), and use `load_dotenv` to load this file. It places all entries there as environment variables, and any subsequent part of your code that relies on environment variables will be able to use them. – Mureinik Jun 11 '19 at 11:33
  • 1
    thanks very much. I solved this problem by as following code. commands = 'source $OCSSWROOT/OCSSW_bash.env;' +l2gencmd1 process=subprocess.Popen(commands,executable='/bin/bash',stdin=subprocess.PIPE,stdout=subprocess.PIPE, shell=True) out, err = process.communicate() where commands consists of two parts. 'source $OCSSWROOT/OCSSW_bash.env;' is the setting environment variable. – Kevin Lee Jul 05 '19 at 02:32