79 lines
2.8 KiB
Plaintext
79 lines
2.8 KiB
Plaintext
From: phd at sun.med.ru (Oleg Broytmann)
|
|
Date: Wed, 28 Apr 1999 19:07:44 +0400 (MSD)
|
|
Subject: 'sourcing' Python scripts?
|
|
In-Reply-To: <372713AD.6ABA444@cern.ch>
|
|
Message-ID: <Pine.SOL2.3.96.SK.990428184925.25400A-100000@sun.med.ru>
|
|
Content-Length: 2587
|
|
X-UID: 1118
|
|
|
|
Hello!
|
|
|
|
On Wed, 28 Apr 1999, Haimo G. Zobernig wrote:
|
|
> this might be a unix rather than a Python problem, but I need to set
|
|
|
|
Yes, it is of unix...
|
|
|
|
> environment variables from a Python program *in the parent process*
|
|
> that is running the Python script ( a la os.environ['BAR'] = 'foo' ).
|
|
> In other words, I want to achieve the equivalent of 'sourcing' the
|
|
> Python script. Can this be done? Even better would be a solution that
|
|
> also works on the various WinAbominations... (well, NT at least)
|
|
|
|
Don't know about NT, sorry. Will talk about unix.
|
|
|
|
Preface.
|
|
When you run a program (python script, e.g.), shell (that run the
|
|
program) forks and looses any connection to running program. The program
|
|
may do anything it wants (change current directory, for example), but all
|
|
chnages are local to the program's process (and children). Parent shell
|
|
does not know anything. This is the nature of multitasking environment.
|
|
For the shell, the only way to set environment (change directory, etc.)
|
|
is to give commands to that shell.
|
|
|
|
Well, now you want to run a program, and pass the results to a parent
|
|
shell. Here is how you should do it.
|
|
First, your program should write the shell commands to stdout. Second,
|
|
you need to ask the shell to process these commands:
|
|
(in shell command line) eval `myscript.py`
|
|
Note "eval" and backticks. Backticks in most (if not all) unix shells mean
|
|
"run the command and save its stdout". Eval processes saved stdout as
|
|
shell commnads.
|
|
|
|
Please note. There are two different kinds of shell syntax - Bourne
|
|
shell and C shell.
|
|
Usually any program that intended to run under such conditions, can
|
|
output two different set of commands - for Bourne shell and for C shell.
|
|
Some programs parse SHELL env var (if it matches /bin/*csh - it is a
|
|
C-shell variant, else it is Bourne shell), some programs can be controlled
|
|
with command line switch (-c for c-shell, nothing for bourne shell). Choose
|
|
your method, but please do not force your users to switch a shell just
|
|
because your program can only work with one shell but not another.
|
|
|
|
Example:
|
|
|
|
(in python program my_prog.py):
|
|
|
|
if under_cshell: # expect C shell
|
|
print "setenv MY_VAR1 value1"
|
|
print "setenv MY_VAR2 value2"
|
|
else: # expect Bourne shell
|
|
print "MY_VAR1=value1"
|
|
print "MY_VAR2=value2"
|
|
print "export MY_VAR1 MY_VAR2"
|
|
|
|
(in shell):
|
|
eval `my_prog.py`
|
|
|
|
> Haimo G. Zobernig
|
|
> Haimo.Zobernig at cern.ch
|
|
|
|
Oleg.
|
|
----
|
|
Oleg Broytmann National Research Surgery Centre http://sun.med.ru/~phd/
|
|
Programmers don't die, they just GOSUB without RETURN.
|
|
|
|
|
|
|
|
|
|
|