Search code examples
pythonlinuxsubprocesscall

Python subprocess.call issue


When I run the following in Python 3.2.3 in Linux it does nothing...

subprocess.call("export TZ=Australia/Adelaide", shell=True)

However if I run it in the terminal it works...

export TZ=Australia/Adelaide

I haven't had an issue with using subprocess.call before. Just seems to be this one. I'm running as a superuser so it's not a sudo thing, and I've also tried putting an r in front of the string to make it a raw string.

Any ideas? Thanks.


Solution

  • A subprocess (shell in this case) can't (normally) modify its parent environment.

    To set the local timezone for the script and its children in Python (on Unix):

    #!/usr/bin/env python3
    import os
    import time
    from datetime import datetime, timezone
    
    os.environ['TZ'] = 'Australia/Adelaide'
    time.tzset()
    print(datetime.now(timezone.utc).astimezone())
    # -> 2015-09-25 05:02:52.784404+09:30
    

    If you want to modify the environment for a single command then you could pass env parameter:

    #!/usr/bin/env python
    import os
    import subprocess
    
    subprocess.check_call('date', env=dict(os.environ, TZ='Australia/Adelaide'))
    # -> Fri Sep 25 05:02:34 ACST 2015