2016-09-25 1 views
0

Ich habe etwas Code, den ich von Perl in Python übersetzt habe, aber ich habe eine Zeit lang versucht, diesen letzten Teil herauszufinden.Von Perl zu Python

my $bashcode=<<'__bash__'; 
. /opt/qip/etc/qiprc; 
. /opt/sybase/sybase.sh 
perl -mdata::dumper -e 'print dumper \%env'; 
__bash__ 
my $var1; 
eval qx(bash -c "$bashcode"); 

Ich verstehe zwar, (ein bisschen), was dies tut, kann ich nicht scheinen, um herauszufinden, wie dies in Python zu tun. Jede Hilfe würde sehr geschätzt werden.

+1

'os.system ("bash -c" + bashcode)'? –

+0

Die Verwendung von Perl, nur um einen Dump der Umgebung zu erhalten, erscheint zweifelhaft, es sei denn, Sie benötigen es im Perl-Format, das von 'data :: dumper' generiert wurde. Nur 'env' in der Shell sollte Ihnen die gewünschte Ausgabe geben. Ob Sie 'bash -c" code "von Perl oder Python aufrufen, sollte unerheblich sein; Die einzige Frage ist wirklich, warum Sie * entweder * verwenden, wenn dies eindeutig eine Bash-Aufgabe ist. Wenn die Aufgabe darin besteht, diese Variablen in Python zu importieren, sehen Sie sich vielleicht [shlex] (https://docs.python.org/3/library/shlex.html) an. – tripleee

+0

Der vorhandene Code verwendet ein Bash-Skript, um zwei andere Skripts aufzurufen, um einige Umgebungsvariablen festzulegen. Anschließend wird diese geänderte Umgebung durch Dumping im Perl-Format aus dem Bash-Skript wieder an das ursprüngliche Perl-Skript übergeben. Sie müssen diesen Teil ersetzen (vielleicht nur mit 'env' als dritte Zeile des Bash-Skripts) und einen Pythony-Weg verwenden, um' bash -c ... 'auszuführen und die Ausgabe zu erfassen und zu parsen. – ysth

Antwort

1

Ihr Programm erzeugt ein Skript und führt es aus.

Eine erste Python Näherung ist:

import os 
script=""". /opt/qip/etc/qiprc; 
      . /opt/sybase/sybase.sh 
      perl -mdata::dumper -e 'print dumper \%env'; 
""" 
os.system(script) 

Wie Sie sehen können, perl noch in Ihrem Skript verwendet wird, die die Moduldaten verwendet :: dumper. Wenn Sie Python hier verwenden möchten, benötigen Sie möglicherweise das entsprechende Modul.

+0

Ja, da stecke ich fest. Das angegebene Beispiel stammt aus dem ursprünglichen Perl-Skript. Ich benutze es nicht im Python-Code, aber ich möchte herausfinden, wie es in das Python-Äquivalent – mrthingfish

+0

zu übersetzen Ich vermute, dass es nur Ihre Umgebungsvariablen in einer lesbaren Weise ablegt. Verwenden Sie einfach den Shell-Befehl "env" und das kann genug sein. – sureshvv

+0

Beachten Sie, dass '% env' nicht mit '% ENV' identisch ist. Obwohl dies in% env sein könnte, ist es wahrscheinlich eine Überprüfung wert, um sicherzustellen, dass dies der Fall ist. – stevieb

0

Dieser Teil:

my $bashcode=<<'__bash__'; 
. /opt/qip/etc/qiprc; 
. /opt/sybase/sybase.sh 
perl -mdata::dumper -e 'print dumper \%env'; 
__bash__ 

Ist ein hier doc und Sie würden dies in Python tun:

bashcode="""\ 
. /opt/qip/etc/qiprc; 
. /opt/sybase/sybase.sh 
perl -mdata::dumper -e 'print dumper \%env'; 
""" 

Sie zu Bash berappen wäre so etwas wie os.system oder subprocess.check_output verwenden.

Das Ergebnis davon wird dann eval zugeführt, um als Perl-Code ausgeführt zu werden.

(Die Weisheit und das Ergebnis der eval hängt davon ab, was diese Bash-Befehle erzeugen. Es scheint, dass diese Befehle ein Perl-Skript erzeugen. Offensichtlich wird das in Python nicht ausgeführt. Python hat auch eval. Use eval in jeder Sprache vorsichtig.)

Die Verwendung von \%env in Perl scheint den Zugriff auf die Umgebung des Hosts anzuzeigen. Die tatsächliche Perl-Variable für den Zugriff auf den Betriebssystemumgebungshash ist jedoch ENV in Großbuchstaben. In Bash, greifen Sie auf die Umwelt mit einem Klein env

die Host-Umgebung in Python zugreifen zu können, verwenden os.environ