Seite 2 von 2
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 14. Januar 2021, 03:08
von __blackjack__
@Susann.M.23: Wenn Du Python programmieren möchtest, dann musst Du Python lernen. Nicht irgendwie versuchen Dir das zusammen zu raten, sondern wirklich hinsetzen und mindestens mal ein Grundlagentutorial durcharbeiten. In der Python-Dokumentation gibt es beispielsweise eines. Programmieren durch raten funktioniert nicht.
Wenn Du das ausführst bekommst Du eine Fehlermeldung. Nach durcharbeiten der Python-Grundlagen solltest Du verstehen was da falsch ist und kannst das dann korrigieren.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 14. Januar 2021, 15:28
von Susann.M.23
__blackjack__ hat geschrieben: Donnerstag 14. Januar 2021, 03:08
Wenn Du das ausführst bekommst Du eine Fehlermeldung. Nach durcharbeiten der Python-Grundlagen solltest Du verstehen was da falsch ist und kannst das dann korrigieren.
Den Code habe ich wie folgt versucht zu korrigieren:
datei.sh
Code: Alles auswählen
#!/bin/bash
./datei.py 500 50
read -p "Zum Beenden Enter drücken oder Ctl + C"
datei.py
Code: Alles auswählen
#!/usr/bin/env python3
import sys
import random
def func():
mu, sigma = sys.argv[1], sys.argv[2]
print(random.normalvariate(mu, sigma))
varialble = input ("Zum Beenden Enter drücken oder Ctl + C")
Bei obigen Code erhalte ich folgende Fehlermeldung:
Code: Alles auswählen
File "./datei.py", line 7
mu, sigma = sys.argv[1], sys.argv[2]
^
IndentationError: expected an indented block
Zum Beenden Enter drücken oder Ctl + C
Hat wer eine Idee wie das gefixt werden kann ?
Ich benötige diesen Code als einfaches Beispiel um zu sehen wie das folgende Muster an zu wenden ist, damit ich das dann selbst auf andere gleich geartete Fälle anwenden kann.
Code: Alles auswählen
import sys
def func(arg1, arg2):
# do_somehing
arg1, arg2 = sys.argv[1], sys.argv[2]
print(func(arg1, arg2))
Danke
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 14. Januar 2021, 15:41
von sparrow
@Susann.M.23: Langsam frage ich mich, ob es um einen Hering geht.
Seit deinem vorherigen Beitrag hat sich nichts geändert. Es bleibt bei der Aussage von __blackjack__: Wenn du Python programmieren möchtest, dann musst du Python lernen. Das
offizielle Tutorial bietet sich da an.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 14. Januar 2021, 16:08
von Susann.M.23
sparrow hat geschrieben: Donnerstag 14. Januar 2021, 15:41
@Susann.M.23: Langsam frage ich mich, ob es um einen Hering geht.
Seit deinem vorherigen Beitrag hat sich nichts geändert. Es bleibt bei der Aussage von __blackjack__: Wenn du Python programmieren möchtest, dann musst du Python lernen. Das
offizielle Tutorial bietet sich da an.
Ich benötige dies als einfaches Beispiel um sehen zu können wie die Bezeichnungen im Muster an zu wenden sind.
Wie ich gefunden habe, kann ein "IndentationError: expected an indented block" von einer von Python wohl interpretierten, bestehenden oder nicht bestehenden Einrückung her rühren.
In der folgenden Variante mit geänderte Einrückung, bekomme ich zwar noch immer kein Ergebnis ausgegeben, jedoch immerhin schon mal keine Fehlermeldungen mehr:
datei.sh
Code: Alles auswählen
#!/bin/bash
./datei.py 500 50
read -p "Zum Beenden Enter drücken oder Ctl + C"
datei.py
Code: Alles auswählen
#!/usr/bin/env python3
import sys
import random
def func():
mu, sigma = sys.argv[1], sys.argv[2]
print(random.normalvariate(mu, sigma))
varialble = input ("Zum Beenden Enter drücken oder Ctl + C")
Vlt. fehlt auch nur noch die Übergabe des .py Ergebnisses an bas und die Ausgabe dort. Schauen wir mal.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 14. Januar 2021, 16:48
von __blackjack__
@Susann.M.23: Nochmal: Du musst Python lernen wenn Du Python programmieren willst. Die Bedeutung von Einrückung ist absolute Grundlage und wird in Grundlagentutorials und Einsteigerliteratur erklärt. Sogar in schlechten!
Programmieren durch raten funktioniert nicht, und programmieren durch Muster anwenden auf Code den man gar nicht versteht, funktioniert genau bis zu dem Punkt, an dem man auf ein Problem trifft was Verständnis der Programmiersprache erfordert. Was sehr schnell der Fall sein kann. Und spätestens dann muss man doch die Programmiersprache lernen. Oder versuchen sich das von anderen für Lau im Internet durch beharrliches wiederholen von geratenem Code geradebiegen zu lassen. Da bist Du glaube ich gerade dabei zu lernen, dass das nicht in jedem Forum funktioniert.
Und lass mal bitte sowohl in Bash als auch in Python diese unsinnigen letzten Zeilen weg. Das ist supernervig, insbesondere wenn das dann auch noch zweimal direkt hintereinander kommt ohne irgend einen Sinn zu haben.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 14. Januar 2021, 22:56
von Susann.M.23
__blackjack__ hat geschrieben: Donnerstag 14. Januar 2021, 16:48
Und lass mal bitte sowohl in Bash als auch in Python diese unsinnigen letzten Zeilen weg. Das ist supernervig, insbesondere wenn das dann auch noch zweimal direkt hintereinander kommt ohne irgend einen Sinn zu haben.
Die unsinnigen letzen Zeilen, verhindern das sich ein Terminalfenster schließt, wenn die Codabarbeitung beendet ist. Das setze ich ganz gerne ein, da es recht hilfreich ist.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 14. Januar 2021, 23:10
von Sirius3
Terminal-Programme startet man in einem Terminal. Da geht dann auch kein Fenster zu.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Freitag 15. Januar 2021, 18:47
von Susann.M.23
Sirius3 hat geschrieben: Donnerstag 14. Januar 2021, 23:10
Terminal-Programme startet man in einem Terminal. Da geht dann auch kein Fenster zu.
Mit der "unsinnigen und nervenden letzten Zeile" kann man das bash Script per Doppelklick aus führen und braucht vorher kein Terminal zu öffnen oder einen Link, Starter an zu legen. So sind die Geschmäcker halt unterschiedlich.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Freitag 15. Januar 2021, 20:42
von __blackjack__
@Susann.M.23: Wenn man das im Terminal ausführt, da wo man so etwas ausführt, nervt es nur. Und es funktioniert auch nicht wirklich mit Python, denn wenn eine unerwartete Ausnahme auftritt, dann wird diese letzte Zeile nicht ausgeführt, und das Terminal geht einfach zu ohne das man die Chance hatte die Fehlermeldung zu lesen. In Shell-Skripten funktioniert das auch nur halbwegs weil die total bekloppt auf Fehler reagieren: Sie machen einfach weiter als ob es keinen Fehler gab, auch wenn das Programm gar nicht mehr in einem sinnvollen/konsistenten Zustand ist.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Samstag 16. Januar 2021, 00:05
von Susann.M.23
Mittlerweile habe ich eine sehr schöne Anleitung zu dem von mir benötigten Thema Übergabe von Variablen von bash an .py und Export von Ergebnissen von .py nach bash gefunden. Sofern das außer bei mir noch bei wem von Interesse sein sollte, folgend der Link.
https://www.xspdf.com/resolution/52426784.html
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 28. Januar 2021, 21:32
von Susann.M.23
Hallo,
mittlerweile habe ich es wie folgt hin bekommen aus dem .py Codestück:
* eine .py Funktion zu machen
* die .py Datei durch die.sh Datei auf zu rufen
* und die Ausgabe der .py Datei an die .sh Datei zu übergeben und dort per Echo aus zu geben.
004_zufall.sh
Code: Alles auswählen
#!/bin/bash
#./004_zufall.py 5 12
var_output= $(echo $'./004_zufall.py ')
echo $var_output
read -p "Zum Beenden Enter drücken oder Ctl + C"
004_zufall.py
Code: Alles auswählen
#!/usr/bin/env python3
import random
def zufallszahl_normalverteilt():
mu=5
sigma=12
print(random.normalvariate(mu, sigma))
zufallszahl_normalverteilt()
varialble = input ("Zum Beenden Enter drücken oder Ctl + C")
Die Implemetierung der Übergabe der Eingabewerte von "mu" und "sigma" von der bash Datei aus an die in der .py Datei befindlichen Funktion ist mir bisher nicht gelungen. Eventuell hat jemand einen Hinweis für mich was dafür zusätzlich zu folgendem notwendig ist:
* Verwendung des im Moment ausgeremmten # var_output= $(echo $'./004_zufall.py 5 12 ') in der .sh Datei
* Verwendung des im Moment ausgeremmten "# import sys" in der .py Datei
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 28. Januar 2021, 22:51
von nezzcarth
Eigentlich hast du hier im Thread doch schon alle Hinweise erhalten, du benötigst. Leider schlägt sich nichts davon in deinem Beispiel nieder. Wo liegen denn bei dem, was dir bisher erklärt/vorgeschlagen wurde, konkrete Verständnisschwierigkeiten vor?
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 28. Januar 2021, 23:03
von Susann.M.23
nezzcarth hat geschrieben: Donnerstag 28. Januar 2021, 22:51
Eigentlich hast du hier im Thread doch schon alle Hinweise erhalten, du benötigst. Leider schlägt sich nichts davon in deinem Beispiel nieder. Wo liegen denn bei dem, was dir bisher erklärt/vorgeschlagen wurde, konkrete Verständnisschwierigkeiten vor?
Ich sehe nicht wie ich das Folgende Prinzip für die Übergabe der Parameter von bash an Python anwenden kann.
import sys
def func(arg1, arg2):
# do_somehing
arg1, arg2 = sys.argv[1], sys.argv[2]
print(func(arg1, arg2))
Then you will use it directly on bash
python script_name.py arg1 arg1
Um erkennen zu können wie das gemeint ist, versuche ich das angefragte Beispiel zu erlangen, wo ich auf Grund dessen das mir das Beispiel klar ist, erkennen kann wie das funktioniert.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Donnerstag 28. Januar 2021, 23:47
von Sirius3
In Deinen von Bash-Skripten aufgerufenen Python-Skripten macht diese letzte Zeile mit dem Input gar keinen Sinn, außer man ist so versessen darauf, ständig Enter zu drücken.
Die minimale Transferleistung ist es hier, statt arg1 mu und statt arg2 sigma zu schreiben:
Code: Alles auswählen
#!/usr/bin/env python3
import sys
import random
def main():
mu = float(sys.argv[1])
sigma = float(sys.argv[2])
print(random.normalvariate(mu, sigma))
if __name__ == "__main__":
main()
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Freitag 29. Januar 2021, 12:57
von nezzcarth
Das Shell-Skript hat auch noch etwas Verbesserungspotential. Variablen-Ersetzung sollte immer in doppelten Anführungszeichen stattfinden, ansonsten hat man ein Sicherheitsproblem. Das "echo" wird auch nicht gebraucht. Ich lande dann bei folgendem:
Code: Alles auswählen
#!/usr/bin/sh
output="$(./test.py 1 2)"
echo "$output"
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Freitag 29. Januar 2021, 13:59
von DeaD_EyE
Mit Here-Doc kann man komische Sachen machen:
Code: Alles auswählen
echo "Hello from Bash"
function rnd { python3 <<EOF
"""
Python Code
"""
import random
mu = 100
sigma = 50
print(random.normalvariate(mu, sigma))
EOF
}
function get_ips { python3 <<'__EOF'
import json
from subprocess import check_output
def get_ips(interface):
data = check_output(["ip", "-j", "a", "s", interface], encoding="utf8")
data = json.loads(data)
results = []
for result in data:
if "addr_info" in result:
for addr_info in result["addr_info"]:
results.append(addr_info["local"])
return results
if __name__ == "__main__":
print(get_ips("eth0"))
__EOF
}
for i in {1..10}; do
echo $i
array[$i]=$(rnd)
done
echo "Random Values: ${array[*]}"
echo "Lokale IPs $(get_ips)"
Wenn man den Code einmal ausführt, sieht man erst mal wie langsam das ist.
Jedes Mal muss der Python-Interpreter neu geladen werden. Das dauert.
Was ich mit here-doc nicht so eben auf die Schnelle hinbekommen habe, ist die Übergabe von Argumenten an Python.
Aber ich würde Here-Doc nicht verwenden. Python-Code sollte nicht mit anderem Code gemischt werden.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Samstag 30. Januar 2021, 12:26
von Susann.M.23
Sirius3 post_id=381893
Code: Alles auswählen
#!/usr/bin/env python3
import sys
import random
def main():
mu = float(sys.argv[1])
sigma = float(sys.argv[2])
print(random.normalvariate(mu, sigma))
if __name__ == "__main__":
main()
Besten Dank. jetzt habe ich ein funktionierendes Muster, was ich ergründen und anwenden kann.
nezzcarth post_id=381908
Das Shell-Skript hat auch noch etwas Verbesserungspotential. Variablen-Ersetzung sollte immer in doppelten Anführungszeichen stattfinden, ansonsten hat man ein Sicherheitsproblem. Das "echo" wird auch nicht gebraucht. Ich lande dann bei folgendem:
Code: Alles auswählen
#!/usr/bin/sh
output="$(./test.py 1 2)"
echo "$output"
Wenn ich #!/usr/bin/sh gegen #!/bin/bash ersetze, funktioniert es bei mir. Sonst findet das bash Script bei mir die .py Datei nicht.
In wie fern wäre die Verwendung von einfachen Anführungszeichen ein Sicherheitsproblem ?
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Samstag 30. Januar 2021, 15:41
von __blackjack__
@Susann.M.23: Die Verwendung von einfachen Anführungszeichen sind kein Sicherheitsproblem. Du kannst also weder Shell/Bash-Programmierung noch Python, sondern willst einfach nur irgendwelche Textvorlagen die Du ohne irgendwas wirklich zu verstehen zu Programmen zusammensetzen willst. Viel Glück dabei. Das wirst Du brauchen.
Re: Einbindung von Python3 Code in eine bash Datei
Verfasst: Samstag 30. Januar 2021, 16:01
von nezzcarth
Susann.M.23 hat geschrieben: Samstag 30. Januar 2021, 12:26
In wie fern wäre die Verwendung von einfachen Anführungszeichen ein Sicherheitsproblem ?
Einfache Anführungszeichen sind was anderes (und machen auch was anderes, daher spielen sie hier keine Rolle). In deinen Code-Beispielen hast du die Anführungszeichen bei den Ersetzungen jedoch ganz weggelassen und
das kann ein Problem sein, da der Inhalt dann nach Whitespaces gesplittet wird. Das kann zu seltsamen, in der Regel ungewollten Effekten, führen (zum Beispiel Einschleusen von Parametern).