In dieser Antwort wird erläutert, wie ein mehrzeiliges Python-Snippet über die Befehlszeile in einem Terminal ausgeführt wird. Mir ist aufgefallen, dass die Antwort in Shell-Skripten auch bei verschachtelten Einrückungen hervorragend funktioniert, was sehr schön ist, z
#!/bin/bash
some_text="Hello world"
echo $some_text
cat <<EOF | python -
import sys;
for r in range(3):
print r
for a in range(2):
print "hello"
EOF
Drucke:
0
hello
hello
1
hello
hello
2
hello
hello
Es fällt mir jedoch schwer, Variablen zwischen dem Shell-Skript und dem Python-Snippet zu teilen.
Wie kann ich die Ausgabe des Python-Index im Bash-Skript erfassen? (zB in einer Variablen wie
$output
).Wie kann ich eine Bash-Variable (z. B.
$some_text
) an das Python-Skript übergeben?
python - <<EOF
stattdessen tun .Antworten:
Eine Variable nach Python bringen
Da (wenn der
EOF
Marker nicht in Anführungszeichen steht) die Variablensubstitution erfolgt, bevor Text vom Heredoc anpython
die Standardeingabe übergeben wird, können Sie die Variable direkt in das Skript werfen.Wenn
some_text
wartest
, würde Python sehensome_text = "test"
. Beachten Sie jedoch, dass dies als Sicherheitsanfälligkeit durch Code-Injection angesehen werden kann. Wennsome_text
war"; import os; os.system("evil-command"); x = "
, zum Beispiel, würde Python sehen:und führe diesen bösen Befehl aus.
Wenn Sie Ihren Python-Code ohne Änderungen direkt in ein Skript ziehen möchten, können Sie Ihre Variable exportieren.
und verwenden
os.environ
, um es abzurufen.Das ist ein viel vernünftigerer / sicherer Ansatz.
Ausgabe von Python
Sie können die Befehlsersetzung verwenden, um die Ausgabe des Skripts zu erfassen.
(Beachten Sie, dass alle nachgestellten Zeilenumbrüche entfernt werden.)
quelle
"You could also pass the variable to the script as an argument"
Wie würden Sie das tun, wenn Sie sagen , dass das Python-Skript in das Shell-Skript eingebettet ist?print '$SHELL'
, ist die Ausgabe/bin/bash
oder was auch immer Ihre Shell ist. Wenn Sie die erste Zeile in ändernpython - <<'END'
, lautet die Ausgabe$SHELL
. Wenn Sie vorhandenen Code kopieren und einfügen, um ihn in ein Bash-Skript einzubetten, möchten Sie mit ziemlicher Sicherheit keine Shell-Ersetzungen - Sie möchten, dass der Code genauso ausgeführt wird, wie er ausgeführt wird, wenn er nicht in ein Bash-Skript eingebettet ist, oder?Das Problem bei Ihrem Ansatz ist, dass das eingebettete Python-Skript keinen Zugriff mehr auf das ursprüngliche stdin hat (da sein stdin ... selbst ist).
Wenn das ein Problem ist, können Sie schreiben:
Oder wenn das Python-Skript einfache Anführungszeichen enthält:
Oder:
quelle
Verwenden Sie einen Strich als Dateinamen:
Ich weiß nicht, ob
sys.argv[1:]
dies in Python der richtige Weg ist. Für -e / -c können Sie das Ende der Argumente mit - angeben:Ausgabe erfassen und STDERR umleiten:
quelle
1) Sie können Variablenzuweisungen in eine Datei in Python schreiben und diese dann in Ihrem Bash-Skript als Quelle angeben.
2) Da Ihr Wort (EOF) nicht in Anführungszeichen steht, werden alle Zeilen des hier beschriebenen Dokuments einer Parametererweiterung unterzogen. Sie können dies verwenden, um Dinge an das Python-Skript zu übergeben.
quelle