Führen Sie das Programm mit einer Umgebung aus, die auf Variablen in einer Datei festgelegt ist

7

Ich möchte ein Programm (in diesem Fall Python) nur mit den in einer Datei definierten Umgebungsvariablen ausführen, z. B vars.env.:

FOO=bar
X=12

Hier ist ein einfaches Python-Skript, das die Umgebung druckt:

import os
print os.environ

Wenn ich laufe env -i python script.py, ist os.environ wie erwartet leer. Ebenso, wenn ich renne

$ env -i FOO=bar X=12 python env.py

Ich bekomme

env: {'X': '12', 'FOO': 'bar'}

Ich möchte jedoch die Umgebung aus meiner vars.envDatei laden, wenn ich das Skript ausführe. Wie kann ich das erreichen?

EDIT: Eine Sache, die ich tun könnte, ist diese env-Datei zu katzen, env -i `cat vars.env` python env.pyaber ich würde es vorziehen, sie auf irgendeine Weise beschaffen zu können.

mdkess
quelle
Ich verstehe die Frage nicht: Sie haben anscheinend bereits einen Weg gefunden, ein Programm mit einer Umgebung auszuführen, die auf Variablen in einer Datei eingestellt ist. Ist die Frage, wie das aus dem Python-Skript heraus gemacht wird, damit Sie es direkt ausführen können /path/to/myscript.py?
Gilles 'SO - hör auf böse zu sein'

Antworten:

5

In Anbetracht der angezeigten Datei sollten Sie in der Lage sein:

(set -f ; IFS='
' ; env - $(cat /path/to/file) /path/to/your/program
)

Wenn es nicht funktioniert, müssen Sie zuerst Ihre Umgebungsdatei formatieren. Hier ist ein Beispiel:

(set -f ; IFS='
' ; env - $(cat) printenv 
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore

Ich dachte zuerst, Sie könnten es über die Shell tun - aber es wird wahrscheinlich eine eigene Umgebung festlegen, bevor Sie Ihr Programm aufrufen. Aber ich kann zumindest zeigen, dass die Argumente richtig zugeordnet sind:

(set -f; IFS='
' ; env - $(cat) sh -c 'echo "$variable3"'
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
value3 an$d s'om\e m"ore

Wenn Sie es dennoch lieber als Quelle verwenden möchten, können Sie die Shell folgendermaßen verwenden:

(echo '$1'; cat; echo '$2') <<\ENV |\
env - sh -s -- 'set -a' printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
###OUTPUT###
PWD=/home/mikeserv/test
SHLVL=1
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
_=/usr/bin/printenv

Beachten Sie, dass ich das $IFSZeug entfernt habe - das ist auf diese Weise nicht notwendig -, aber ich musste mich über die Anführungszeichen in der Datei informieren. Hier bin ich im Wesentlichen .dotSourcing stdin- Lesen der |pipeals Eingabe - aber Sie können jede Datei verwenden. Ich benutze set -avor dem Lesen der Eingabedatei, um die --allexportOption festzulegen.

Das ist ein Ergebnis der Verwendung von bash's sh- es fügt hinzu $PWD, $SHLVLund $_. Damit ist dashes etwas besser. Außerdem werden dashkeine Exporte hinzugefügt, sodass Sie den -aParameter in der Befehlszeile angeben können :

(cat; echo '$1') <<\ENV |\
env - dash -sa -- printenv 
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
PWD=/home/mikeserv/test

Nur $PWDkommt durch.

mikeserv
quelle
1

Sie können alles tun in Python:

$ cat config.py
env = {
    'FOO' : 'bar',
    'X'   : '12',
}

$ cat test.py
import os
import config

os.environ.clear()
os.environ.update(config.env)
print os.environ

Dann:

$ python test.py
{'X': '12', 'FOO': 'bar'}
cuonglm
quelle
1

Eine andere Möglichkeit wäre, die Datei in ein Array einzulesen und das Array dann als Argument zu verwenden. Der Vorteil gegenüber der Verwendung der Prozesssubstitution besteht darin, dass Werte mit Leerzeichen verarbeitet werden können. Beispiel:

$ cat file
FOO=bar
X=12
var=a b c

$ IFS=$'\n' read -d '' -ra vars < file
$ env -i "${vars[@]}" python env.py
{'var': 'a b c', 'X': '12', 'FOO': 'bar'}
user000001
quelle