Einbindung von Python3 Code in eine bash Datei
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 44
- Registriert: Montag 30. März 2020, 13:23
Den Code habe ich wie folgt versucht zu korrigieren:__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.
datei.sh
Code: Alles auswählen
#!/bin/bash
./datei.py 500 50
read -p "Zum Beenden Enter drücken oder Ctl + C"
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")
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
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))
@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.
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.
-
- User
- Beiträge: 44
- Registriert: Montag 30. März 2020, 13:23
Ich benötige dies als einfaches Beispiel um sehen zu können wie die Bezeichnungen im Muster an zu wenden sind.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.
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")
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 44
- Registriert: Montag 30. März 2020, 13:23
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.__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.
-
- User
- Beiträge: 44
- Registriert: Montag 30. März 2020, 13:23
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.
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
-
- User
- Beiträge: 44
- Registriert: Montag 30. März 2020, 13: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
https://www.xspdf.com/resolution/52426784.html
-
- User
- Beiträge: 44
- Registriert: Montag 30. März 2020, 13: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
004_zufall.py
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
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"
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")
* 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
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?
-
- User
- Beiträge: 44
- Registriert: Montag 30. März 2020, 13:23
Ich sehe nicht wie ich das Folgende Prinzip für die Übergabe der Parameter von bash an Python anwenden kann.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?
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
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.python script_name.py arg1 arg1
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:
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()
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"
- DeaD_EyE
- User
- Beiträge: 1017
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Mit Here-Doc kann man komische Sachen machen:
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.
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)"
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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
-
- User
- Beiträge: 44
- Registriert: Montag 30. März 2020, 13:23
Sirius3 post_id=381893
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:
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 ?
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()
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"
In wie fern wäre die Verwendung von einfachen Anführungszeichen ein Sicherheitsproblem ?
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
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).Susann.M.23 hat geschrieben: ↑Samstag 30. Januar 2021, 12:26 In wie fern wäre die Verwendung von einfachen Anführungszeichen ein Sicherheitsproblem ?