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: 8114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 13. Januar 2021, 18:08

Das ist ja jetzt nicht wirklich etwas spezielles zwischen Bash und Python. In der Bash rufst Du das Python-Programm so auf wie Du auch jedes andere Programm aufrufen würdest, egal in welcher Programmiersprache das geschrieben ist:

Code: Alles auswählen

#!/bin/bash

./aufgerufene_py_datei.py 500 50
Und Python ist das auch völlig wurscht in welcher Programmiersprache das Programm geschrieben ist, von dem aus es aufgerufen wurde. Argumente stehen in der Sequenz `sys.argv` als Zeichenketten. Von da geht es ganz normal mit Python weiter:

Code: Alles auswählen

#!/usr/bin/env python3
import random
import sys

import matplotlib.pyplot as plt


def main():
    mean, standard_deviation = map(float, sys.argv[1:3])
    plt.plot(
        [random.normalvariate(mean, standard_deviation) for _ in range(100)]
    )
    plt.show()


if __name__ == "__main__":
    main()
Das Internet ist dazu da, um "Punkt, Punkt, Komma, Strich" durch "Doppelpunkt, Bindestrich, runde Klammer" zu ersetzen.
nezzcarth
User
Beiträge: 1235
Registriert: Samstag 16. April 2011, 12:47

Mittwoch 13. Januar 2021, 18:44

Susann.M.23 hat geschrieben:
Mittwoch 13. Januar 2021, 10:22
Ich habe halt ein paar bash Scripte, bei denen ich testweise ein paar Passagen durch .py realisieren möchte. Sozusagen, das Sammeln erster Erfahrungen am lebenden Objekt. Eventuell weite ich das später noch ein wenig aus.
Ich verstehe zwar die Idee, aber ich halte das für keinen guten Ansatz. Wenn du Python verwenden möchtest, ist es aus meiner Sicht zielführender, das dann auch konsequent zu machen. Solche Hybrid-Lösungen sind echt problematisch und damit es überhaupt funktioniert, fängst du an, dir Patterns anzueignen, die dich später, wenn in Python flüssiger bist, möglicherweise davon abhalten, "schöne" Programme zu schreiben.

Wenn du eine Programmiersprache möchtest, die deutlich von Shell-Scripten beeinflusst, aber mächtiger ist, nimm Perl. Das ist zwar nicht mehr besonders angesagt, aber aus meiner Sicht in dem konkreten Fall alle mal besser, als irgendwelche Python-Bash-Mischungen. In Perl kann man dann auch mit wenig Aufwand Skripte schreiben, die im Wesentlichen aus Shell-Aufrufen bestehen wenn man es denn unbedingt möchte.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Donnerstag 14. Januar 2021, 00:01

__blackjack__ hat geschrieben:
Mittwoch 13. Januar 2021, 18:08
Das ist ja jetzt nicht wirklich etwas spezielles zwischen Bash und Python. In der Bash rufst Du das Python-Programm so auf wie Du auch jedes andere Programm aufrufen würdest, egal in welcher Programmiersprache das geschrieben ist:

Code: Alles auswählen

#!/bin/bash

./aufgerufene_py_datei.py 500 50
Und Python ist das auch völlig wurscht in welcher Programmiersprache das Programm geschrieben ist, von dem aus es aufgerufen wurde. Argumente stehen in der Sequenz `sys.argv` als Zeichenketten. Von da geht es ganz normal mit Python weiter:

Code: Alles auswählen

#!/usr/bin/env python3
import random
import sys

import matplotlib.pyplot as plt


def main():
    mean, standard_deviation = map(float, sys.argv[1:3])
    plt.plot(
        [random.normalvariate(mean, standard_deviation) for _ in range(100)]
    )
    plt.show()


if __name__ == "__main__":
    main()
Besten Dank !!! Aber es sieht für mich so aus als ob ich zu blöd dafür bin. Schon folgendes gelingt mir nicht in die gewünschte Form um zu wandeln:

Das sollte so ok sein:
#!/bin/bash

Code: Alles auswählen

./aufzurufene_py_datei.py 100 50
Hier gelingt mir nicht die entsprechende Anpassung:
aufzurufene_py_datei.py

Code: Alles auswählen

#!/usr/bin/env python3
import random 
print(random.normalvariate(mu, sigma))
Sirius3
User
Beiträge: 13917
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 14. Januar 2021, 00:16

Und woher soll der Computer wissen, was mu und sigma sind?
Du mußt doch sehen, dass bei Deinem Programm einiges fehlt, was das Programm von __blackjack__ hat.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Donnerstag 14. Januar 2021, 00:42

Sirius3 hat geschrieben:
Donnerstag 14. Januar 2021, 00:16
Und woher soll der Computer wissen, was mu und sigma sind?
Du mußt doch sehen, dass bei Deinem Programm einiges fehlt, was das Programm von __blackjack__ hat.
Ja das muss irgend wie in die folgende Form:

Code: Alles auswählen

import sys

def func(arg1, arg2):
    # do_somehing
arg1, arg2 = sys.argv[1], sys.argv[2]
print(func(arg1, arg2))
Evtl. so:

Code: Alles auswählen

#!/bin/bash
./aufzurufene_py_datei.py 100 50

Code: Alles auswählen

#!/usr/bin/env python3
import random 
def func(arg1, arg2):
arg1, arg2 = sys.argv[1], sys.argv[2]
print(random.normalvariate(mu, sigma))
Benutzeravatar
__blackjack__
User
Beiträge: 8114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 14. Januar 2021, 03:08

@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.
Das Internet ist dazu da, um "Punkt, Punkt, Komma, Strich" durch "Doppelpunkt, Bindestrich, runde Klammer" zu ersetzen.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Donnerstag 14. Januar 2021, 15:28

__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: 2599
Registriert: Freitag 17. April 2009, 10:28

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.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Donnerstag 14. Januar 2021, 16:08

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: 8114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 14. Januar 2021, 16:48

@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.
Das Internet ist dazu da, um "Punkt, Punkt, Komma, Strich" durch "Doppelpunkt, Bindestrich, runde Klammer" zu ersetzen.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Donnerstag 14. Januar 2021, 22:56

__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: 13917
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 14. Januar 2021, 23:10

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

Freitag 15. Januar 2021, 18:47

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: 8114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 15. Januar 2021, 20:42

@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.
Das Internet ist dazu da, um "Punkt, Punkt, Komma, Strich" durch "Doppelpunkt, Bindestrich, runde Klammer" zu ersetzen.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Samstag 16. Januar 2021, 00:05

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
Antworten