I have been scouring the internet, and cannot seem to find a solution to permanently adding an environment variable, specifically when my OS is macOS Mojave (10.14). It seems there are a lot of tutorials for past versions of the OS, but none for this one one. It also seems every old method has become outdated.

I want to add an environment variable ENV_VAR=12345 to my Mac, so that I can import it into a Python module using os.environ['ENV_VAR']

The most relevant tutorial I have found is this, but it doesn't quite do the trick for me. A lot of others tell you how to temporarily add environment variables to bash, but I don't think this is good enough. I want the addition to be there if you restart terminal.

Can you please either provide a short tutorial or point me to the correct/modern tutorial?

UPDATE: I should have mentioned that I use zsh. This was key.

  • Look at unix.stackexchange.com/questions/346336/… and/or unix.stackexchange.com/questions/48870/global-bash-profile to persist environment variables. – tk421 Apr 9 at 22:18
  • Is the python script run from the command line or us an app run from desktop or finder? – Mark Apr 10 at 8:13
  • @Mark the script is run from the command line! Via python -m module_name – Intrastellar Explorer Apr 10 at 15:20
  • I'm voting to close this question as off-topic because the question is unclear as the shell is zsh which is not mentioned. The tutorials etc are for a different case. If the question was I use zsh and how do I set a environment variable for python then OK The question and answers will just confus anyone new reading them – Mark Apr 10 at 17:09


Since Bash is typically the default shell you can open up this file in your home directory:

$ vim ~/.bash_profile

And add your variable to this file:

export ENV_VAR=12345

You can do this without even having to edit this file if you like, using the following one-liner:

$ echo 'export ENV_VAR=12345' >> ~/.bash_profile

And then confirm like so:

$ cat ~/.bash_profile
for i in ~/.bash_profile.d/[0-9]*; do
  . "$i"
export ENV_VAR=12345

After doing the above, if you open a new terminal you should see that environment variable has been set:

$ echo $ENV_VAR


If you find that you're using an alternative shell such as zsh, that uses a different set of configuration files maintained within your home directory, ~. Luckily the syntax of the changes is basically the same, just different files. So you can add the above example to this file instead:

$ echo 'export ENV_VAR=12345' >> ~/.zshenv

And then when you launch a zsh:

$ echo $ENV_VAR



The file names used to set environment variables differ depending on which shell you use. By default, the mac assigns the bash shell to new users. echo $SHELL if unsure.

From here, check the man page. e.g.: man bash and it will document the files it will execute at runtime. You can add an environment variable to one of those files.

For bash, make sure you export the variable or it wont be inherited by a child process. e.g.: export ENV_VAR=12345 or ENV_VAR=12345; export ENV_VAR


UPDATE: read the comments to @slm's answer. I should have been editing ~/.zshrc not ~/.bash_profile, because I use zsh. The more you know! The below answer also seemed to work, but hacky.

Thanks to @Tim Campbell and @slm, I was able to get something working.


echo $0 outputs -zsh

echo $SHELL outputs /bin/zsh

echo $PATH outputs /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin

My "Hacky" Solution

I made a shell script configure_env.sh and put in in ~/Documents

export ENV_VAR=12345

I then ran chmod +x ~/Documents/configure_env.sh

I then did nano ~/.bash_profile and appended source ~/Documents/configure_env.sh

Then, when I typed echo $ENV_VAR, it returned 12345

:) thank you again to Stack Overflow!

  • 1
    Ugh this is a mess and a dredful idea- you need to edit one file only and add export ENV_VAR=12345 to it and the file is .zshrc So delete everything after I use zsh. ALso the fact you are using zsh must be in the question – Mark Apr 10 at 17:07

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .