Wie rufe ich an? Datei /home/test.sh im Python-Skript

Sep 11 2020

Ich habe eine Datei namens . /home/test.sh(der Abstand zwischen dem ersten .und /ist beabsichtigt), die einige Umgebungsvariablen enthält. Ich muss diese Datei laden und die ausführen .py. Wenn ich den Befehl zuerst manuell auf dem Linux-Server ausführe und dann das Python-Skript ausführe, wird die erforderliche Ausgabe generiert. Ich möchte jedoch . /home/test.shaus Python heraus aufrufen , um das Profil zu laden und den Rest des Codes auszuführen. Wenn dieses Profil nicht geladen ist, werden Python-Skripte ausgeführt und geben 0 als Ausgabe aus.

Der Anruf

subprocess.call('. /home/test.sh',shell=True)

läuft gut, aber das Profil wird nicht auf das Linux-Terminal geladen, um Python-Code auszuführen und die gewünschte Ausgabe zu geben.

Kann jemand helfen?

Antworten

2 alani Sep 12 2020 at 05:10

Umgebungsvariablen werden nicht direkt vom übergeordneten Prozess geerbt, weshalb Ihr einfacher Ansatz nicht funktioniert.

Wenn Sie versuchen, Umgebungsvariablen abzurufen, die in Ihrem Skript festgelegt wurden, können test.shSie sie stattdessen envin einer Sub-Shell verwenden, um sie nach dem Sourcing des Skripts in stdout zu schreiben. In Python können Sie diese und dann analysieren Stellen Sie sie lokal ein.

Der folgende Code funktioniert, sofern test.shkeine Ausgabe selbst geschrieben wird. (Wenn dies der Fall ist, können Sie das Problem umgehen, indem Sie anschließend echoeine Trennzeichenfolge verwenden und vor dem Ausführen der envund dann im Python-Code die Trennzeichenfolge und alles davor entfernen.)

import subprocess
import os

p = subprocess.Popen(". /home/test.sh; env -0", shell=True, 
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)

out, _ = p.communicate()

for varspec in out.decode().split("\x00")[:-1]:
    pos = varspec.index("=")
    name = varspec[:pos]
    value = varspec[pos + 1:]
    os.environ[name] = value

# just to test whether it works - output of the following should include
# the variables that were set
os.system("env")

Es ist auch eine Überlegung wert , dass , wenn alles , was Sie tun wollen , jedes Mal einige Umgebungsvariablen gesetzt ist , bevor Sie eine Python - Code ausführen, dann eine Option nur Ihre beziehen ist test.shvon einem Shell-Script - Wrapper, und nicht versuchen , sie innerhalb Python zu setzen überhaupt:

#!/bin/sh
. /home/test.sh
exec "/path/to/your/python/script $@"

Wenn Sie dann den Python-Code ausführen möchten, führen Sie stattdessen den Wrapper aus.