Einbettung von kurzen Python-Skripten in einem Bash-Skript

Ich möchte den Text von kurzen Python-Skripten in einem Bash-Skript einbetten, für den Gebrauch in sagen, mein .bash_profile . Was ist der beste Weg, so etwas zu tun?

Die Lösung, die ich bisher habe, ist, den Python-Interpreter mit der Option -c anzurufen und dem Dolmetscher zu sagen, was er von stdin liest. Von dort aus kann ich einfache Werkzeuge wie die folgenden, so dass ich Text für den Einsatz in meiner interaktiven Eingabeaufforderung zu verarbeiten:

 function pyexec() { echo "$(/usr/bin/python -c 'import sys; exec sys.stdin.read()')" } function traildirs() { pyexec <<END trail=int('${1:-3}') import os home = os.path.abspath(os.environ['HOME']) cwd = os.environ['PWD'] if cwd.startswith(home): cwd = cwd.replace(home, '~', 1) parts = cwd.split('/') joined = os.path.join(*parts[-trail:]) if len(parts) <= trail and not joined.startswith('~'): joined = '/'+joined print joined END } export PS1="\h [\$(traildirs 2)] % " 

Dieser Ansatz riecht mir doch etwas komisch, und ich frage mich, welche Alternativen dazu so gemacht werden könnten.

Meine bash Scripting Fähigkeiten sind ziemlich rudimentär, so bin ich besonders interessiert zu hören, wenn ich etwas dumm aus der bash Dolmetscher die Perspektive zu tun.

9 Solutions collect form web for “Einbettung von kurzen Python-Skripten in einem Bash-Skript”

Der Python-Interpreter akzeptiert - auf der Kommandozeile als Synonym für stdin damit du die Anrufe an pyexec ersetzen kannst mit:

 python - <<END 

Siehe Kommandozeilenreferenz hier .

Warum musst du -c ? Das funktioniert für mich:

 python << END ... code ... END 

Ohne etwas extra zu brauchen.

Wenn du die Ausgabe der Python in der Bash-Skript verwenden kannst, kannst du so etwas machen:

 #!/bin/bash ASDF="it didn't work" ASDF=`python <<END ASDF = 'it worked' print ASDF END` echo $ASDF 

Manchmal ist es keine gute Idee, hier Dokument zu verwenden. Eine andere Alternative ist die Verwendung von Python-c:

 py_script=" import xml.etree.cElementTree as ET,sys ... " python -c "$py_script" arg1 arg2 ... 

Ein Problem bei der Verwendung von bash here document ist, dass das Skript dann an Python auf stdin wird. Wenn Sie also das Python-Skript als Filter verwenden möchten, wird es unhandlich. Eine Alternative besteht darin, die process substitution des bash zu verwenden, so etwas wie folgt:

 ... | python <( echo ' code here ' ) | ... 

Wenn das Skript es zu lang ist, könntest du here document Inneren des Parens verwenden, wie folgt:

 ... | python <( cat << END code here END ) | ... 

Innerhalb des Skripts können Sie lesen / schreiben, wie Sie normalerweise von / zu Standard-I / O (z. B. sys.stdin.readlines , um alle Eingabe zu verschlingen).

Auch kann python -c verwendet werden, wie in anderen Antworten erwähnt, aber hier ist, wie ich es gern tun, um schön zu formatieren, während immer noch Python's Einrückungsregeln ( Credits ):

 read -r -d '' script <<-"EOF" code goes here prefixed by hard tab EOF python -c $script 

Stellen Sie einfach sicher, dass der erste Charakter jeder Zeile in diesem Dokument eine harte Registerkarte ist. Wenn du das in eine Funktion stellen musst, dann benutze ich den untenstehenden Trick, den ich irgendwo gesehen habe, um es auszuprobieren:

 function somefunc() { read -r -d '' script <<-"----EOF" code goes here prefixed by hard tab ----EOF python -c $script } 

Interessant … ich will jetzt auch eine Antwort 😉

Er fragt nicht, wie man Python-Code innerhalb eines Bash-Skripts ausführt, sondern tatsächlich die Python-Set-Umgebungsvariablen hat.

Setzen Sie das in ein Bash-Skript und versuchen Sie es zu sagen "es funktionierte".

 export ASDF="it didn't work" python <<END import os os.environ['ASDF'] = 'it worked' END echo $ASDF 

Das Problem ist, dass die Python in einer Kopie der Umgebung ausgeführt wird. Alle Änderungen an dieser Umgebung werden nach Python-Exits nicht angezeigt.

Wenn es eine Lösung dafür gibt, würde ich es gerne auch sehen.

Bereit zum Kopieren-Einfügen Beispiel:

 input="hello" output=`python <<END print $input+" world"; END` echo $output 

Wenn du zsh benutzt hast, kannst du Python innerhalb des Skripts mit zsh's join und python stdin option ( python - ) einbetten:

 py_cmd=${(j:\n:)"${(f)$( # You can also add comments, as long as you balance quotes <<<'if var == "quoted text":' <<<' print "great!"')}"} catch_output=$(echo $py_cmd | python -) 

Sie können das Python-Snippet einrücken, also sieht es schöner aus als die EOF oder <<END Lösungen, wenn die Innenfunktionen funktionieren.

Versuche dies :

 #!/bin/bash a="test" python -c "print '$a this is a test'.title()" 
  • Shell-Skript mit subprocess.Popen in Python ausführen?
  • Python's subprocess.Popen () Ergebnisse unterscheiden sich von der Befehlszeile?
  • Python os.environ Variable nicht in der bash Skript passieren
  • Was ist der einfachste Weg, um Matplotlib in OSX in einer virtuellen Umgebung zu arbeiten?
  • Git Bash wird meine Python-Dateien nicht laufen lassen?
  • Drucken aller Shell-Befehle aus Python-Skript, auf Konsole vor dem Ausführen gefeuert
  • Beste Weg, um mit einem Service für Ausbeutung Zweck zu interagieren
  • ERROR virtualenvwrapper in GitBash
  • Was ist das Bash-Äquivalent von Pythons Pass-Anweisung
  • Python vs Bash - In welcher Art von Aufgaben übertrifft jeder den anderen Performance-weise?
  • Wie kann ich ein Superuser-Account auf Cassandra mit Homebrew erstellen?
  • Python ist die beste Programmiersprache der Welt.