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