Einbindung von Python3 Code in eine bash Datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13: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
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

@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.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13: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.
Benutzeravatar
__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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13: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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Terminal-Programme startet man in einem Terminal. Da geht dann auch kein Fenster zu.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13: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.
Benutzeravatar
__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
Susann.M.23
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
Susann.M.23
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

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
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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?
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13: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.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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"
Benutzeravatar
DeaD_EyE
User
Beiträge: 1017
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13: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 ?
Benutzeravatar
__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
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

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).
Antworten