Python without wrapper script

Hans Mulder hansmu at xs4all.nl
Wed Dec 2 15:46:27 EST 2009


Ulrich Eckhardt wrote:
> eric.frederich wrote:
>> Is there a way to set up environment variables in python itself
>> without having a wrapper script.
> 
> Yes, sure, you can set environment variables...
> 
>> The wrapper script is now something like....
>>
>> #!/bin/bash
>>
>> export LD_LIBRARY_PATH="/some/thing/lib:$LD_LIBRARY_PATH"
>> export LD_LIBRARY_PATH="/another/thing/lib:$LD_LIBRARY_PATH"
>>
>> export PATH="/some/thing/bin:$PATH"
>> export PATH="/another/thing/bin:$PATH"
>>
>> python ./someScript.py
> 
> ...but this won't work, I'm afraid.
> 
> LD_LIBRARY_PATH is for the program loader / dynamic linker under Linux. This
> thing is what is invoked _before_ the program is started, any later
> modifications to the environment are ignored.

In cases like yours I have sometimes written Python scripts that acted as
their own wrapper:

#!/usr/bin/env python

import os, sys

if 'LD_LIBRARY_PATH' in os.environ:
     lib_path = os.environ['LD_LIBRARY_PATH']
     if '/some/thing/lib' in lib_path and '/another/thing/lib' in lib_path:
         pass
     else:
         os.environ['LD_LIBRARY_PATH'] += ':/some/thing/lib:/another/thing/lib'
         os.execve(sys.argv[0], sys.argv, os.environ)
else:
     os.environ['LD_LIBRARY_PATH'] = '/some/thing/lib:/another/thing/lib'
     os.execve(sys.argv[0], sys.argv, os.environ)

os.environ['PATH'] = '/some/thing/bin:/another/thing/bin:' + os.environ['PATH']

# At this point, you can import a module that depends
# on LD_LIBRARY_PATH including /some/thing/lib
#
# Alternatively (and more clearly), you can replace the 'pass' above
# by that import statement


This code restarts Python if it has to modify os.environ['LD_LIBRARY_PATH'].

If you try to single-step this code under pdb, you'll get as far as the
os.execve() call.  That call starts Python afresh, without a debugger.
In other words, if you need to use pdb, you'll have to set the environment
variables in the shell.

> Similarly PATH, which tells the shell (e.g. bash) where to find executables.
> If you need that to e.g. find 'python' itself, you're out of luck.
> Otherwise, I believe Python itself doesn't use PATH, so you could set it
> inside and any shells started from Python should pick it up.

You don't have to restart Python if you modify to os.environ['PATH'],
so that bit is easy.



Hope this helps,

-- HansM





More information about the Python-list mailing list