Python without wrapper script

E

eric.frederich

Is there a way to set up environment variables in python itself
without having a wrapper script.

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
 
U

Ulrich Eckhardt

eric.frederich said:
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.

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.

Uli
 
J

Jean-Michel Pichavant

eric.frederich said:
Is there a way to set up environment variables in python itself
without having a wrapper script.

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
try in someScript.py

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

example:

import subprocess
import os
p = subprocess.Popen('/bin/echo $TEST', shell=True, stdout=subprocess.PIPE )
p.communicate()[0]

os.environ['TEST'] = 'hello'
p = subprocess.Popen('/bin/echo $TEST', shell=True, stdout=subprocess.PIPE )
p.communicate()[0]
> 'hello\n'

JM
 
H

Hans Mulder

Ulrich said:
Yes, sure, you can set environment variables...


...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
 
J

Jonathan Hartley

Yes, sure, you can set environment variables...




...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.

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.

Uli


I have had success in modifying LD_LIBRARY_PATH from within my Python
code, to make sure that Python correctly loads DLL's from
subdirectories of my project. (I believe the Python ended up calling
CDll, or somesuch?)
 
J

Jonathan Hartley

I have had success in modifying LD_LIBRARY_PATH from within my Python
code, to make sure that Python correctly loads DLL's from
subdirectories of my project. (I believe the Python ended up calling
CDll, or somesuch?)


Ahar! But of course, I was modifying os.environ, not setting the
actual environment. I see.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,997
Messages
2,570,239
Members
46,827
Latest member
DMUK_Beginner

Latest Threads

Top