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

Dienstag 12. Januar 2021, 23:48

Wie kann ich am Beispiel folgenden Python Codes, in eine bash Datei Python einfügen und das Ergebnis in bash per echo einer Variable ausgeben ? Folgend mein Entwurf:

Python Code, der beispielhaft in unten stehenden bash Code rein soll:

Code: Alles auswählen

# import the random module 
import random 
  
# determining the values of the parameters 
mu = 100
sigma = 50
  
# using the normalvariate() method 
print(random.normalvariate(mu, sigma)) 

Bash Datei Rohling, in den ich gerne als Beispiel für mich, obigen Python Code hätte um das dann für mich als Vorlage für mehrere andere ähnlich gelagerte Fälle nehmen zu können:

Code: Alles auswählen

#!/bin/bash

## Anfang Python Bereich
ausgabewert_des_python_bereichs=$(python -c " hier muss vmtl. irgend wie der Python Code hinein ")

## Ende Python Bereich

echo $ausgabewert_des_python_bereichs

read -p "Zum Beenden Enter drücken oder Ctl + C"
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Mittwoch 13. Januar 2021, 00:58

Nach meinem Versuch und Irrtum Verfahren, ist bei meinem Versuch, Python Code in eine bash Date zu packen und in dieser ein Ergebnis von Python verfügbar zu machen, bzw. aus zu geben, foolgendes bei heraus gekommen:

Code: Alles auswählen

#!/bin/bash

## Anfang Python Bereich
ausgabewert_des_python_bereichs=$(python -c " 

# import the random module 
import random 
  
# determining the values of the parameters 
mu = 100
sigma = 50
  
# using the normalvariate() method 
print(random.normalvariate(mu, sigma)) 

")
## Ende Python Bereich

echo $ausgabewert_des_python_bereichs

read -p "Zum Beenden Enter drücken oder Ctl + C"
Obiges macht erst einmal das was ich möchte. Ist das eher Zufall oder sollte man das lieber irgend wie anders machen ?

Bei der Gelegenheit möchte ich gleich auch noch mal heraus bekommen, wie man das in obigen Fall schreiben müsste, wenn man den Python Code in eine .py Datei packt und diese dann von der Syntax her, von einer bash Datei aufrufen könnte. Dazu habe ich aber bisher noch nichts gefunden.
Benutzeravatar
__blackjack__
User
Beiträge: 8114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mittwoch 13. Januar 2021, 01:57

@Susann.M.23: Kann man so machen, sieht halt etwas sinnfrei und übermässig kompliziert aus. Und ``python`` sollte Python 3 sein. Und das ``read`` am Ende sieht verdächtig überflüssig bis nervig aus. Und `ausgabewert_des_python_bereichs` ist natürlich kein guter Name. Die Kommentare bringen keinen Mehrwert.

Letztlich lässt sich die Funktionalität als "Shell"-Skript auch so ausdrücken (sh reicht, braucht keine Bash zu sein):

Code: Alles auswählen

#!/bin/sh
python3 -c 'import random; print(random.normalvariate(100, 50))'
Und von da ist es dann nur ein kleiner Schritt zu:

Code: Alles auswählen

#!/usr/bin/env python3
import random

print(random.normalvariate(100, 50))
Und schon ist man den zusätzlichen Shell-Prozess auch noch los.
Das Internet ist dazu da, um "Punkt, Punkt, Komma, Strich" durch "Doppelpunkt, Bindestrich, runde Klammer" zu ersetzen.
Benutzeravatar
sparrow
User
Beiträge: 2599
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 13. Januar 2021, 08:32

@Susann.M.23: Warum sollte man Python-Code so in ein bash-Script einbinden? Was ist dein eigentliches Problem und was möchtest du erreichen? Das was du dort mit dem bash-Script tust, ist so als würdest du ein Auto an Moped binden, auf das Moped steigen, damit das Auto ziehen und das dann für Autofahren halten. Könnte sein - für jeden Autofahrer aber klar erkennbar wenig sinnvoll.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Mittwoch 13. Januar 2021, 10:22

sparrow hat geschrieben:
Mittwoch 13. Januar 2021, 08:32
@Susann.M.23: Warum sollte man Python-Code so in ein bash-Script einbinden? Was ist dein eigentliches Problem und was möchtest du erreichen? Das was du dort mit dem bash-Script tust, ist so als würdest du ein Auto an Moped binden, auf das Moped steigen, damit das Auto ziehen und das dann für Autofahren halten. Könnte sein - für jeden Autofahrer aber klar erkennbar wenig sinnvoll.
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.

Im Moment suche ich eine Quelle die mir zeigt, wie ich als nächste Realisierungsvariante, py Code der sich ein eine .py Datei befindet, von einer bash Datei aus aufrufe und wie man in der .py Datei verwendete Variabeln in der .sh Datei verwenden kann. Vom Prinzip her in etwa so etwas:

aufrufende_bash_datei.sh

Code: Alles auswählen

#!/bin/bash

mu = 
sigma=
aufgerufene_py_datei.py

read -p "Zum Beenden Enter drücken oder Ctl + C"
aufgerufene_py_datei.py

Code: Alles auswählen

#!/usr/bin/env python3

# import the required libraries  
import random  
import matplotlib.pyplot as plt  
    
# store the random numbers in a   
# list  
nums = []  
# mu = 500
# sigma = 50
    
for i in range(100):  
    temp = random.normalvariate(mu, sigma) 
    nums.append(temp)  
        
# plotting a graph  
plt.plot(nums) 
plt.show()
 
varialble = input ("Zum Beenden Enter drücken oder Ctl + C")
Benutzeravatar
sparrow
User
Beiträge: 2599
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 13. Januar 2021, 10:47

Das klingt sehr seltsam.

Wenn du Python programmieren möchtest, dann solltest du Programm in Python schreiben. So Python in Bash-Scripte einzubinden ist mindestens ungewöhnlich. Und wenn die Bash-Scripte funktionieren, warum sollte man Dinge darin so platzieren?

Den Vergleich mit dem "lebenden Objekt" finde ich gut. Mein Gedanken bei dieser "Art" der Einbindung erinnert mich eher an Frankenstein. :D
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Mittwoch 13. Januar 2021, 11:18

sparrow hat geschrieben:
Mittwoch 13. Januar 2021, 10:47
Das klingt sehr seltsam ... Und wenn die Bash-Scripte funktionieren, warum sollte man Dinge darin so platzieren?
Das bietet die Möglichkeit, bei der Etablierung zusätzlicher Features für bestehende bash Scripte, diese in .py realisieren zu können. Und somit ermöglicht mir dieser Weg, auch in einer frühen Lernphase, Erfahrungen mit .py am lebenden Objekt zu sammeln.
Benutzeravatar
sparrow
User
Beiträge: 2599
Registriert: Freitag 17. April 2009, 10:28

Mittwoch 13. Januar 2021, 11:24

Mein Rat: Schreib deine Bash-Scripte in Python neu. Komplett. Das ist ein sinnvoller Weg wirklich Erfahrung zu sammeln.
Sirius3
User
Beiträge: 13917
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 13. Januar 2021, 11:25

Aber dazu schreibt man doch ein Python-Programm in einer eigenen .py-Datei und ruft die im Shell-Skript auf, und packt den Code nicht in eine .sh-Datei.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Mittwoch 13. Januar 2021, 11:56

Sirius3 hat geschrieben:
Mittwoch 13. Januar 2021, 11:25
Aber dazu schreibt man doch ein Python-Programm in einer eigenen .py-Datei und ruft die im Shell-Skript auf, und packt den Code nicht in eine .sh-Datei.
Zu dem wie man .py code in eine .sh Datei packt habe ich ja nun ein funktionierendes Beispiel. Dieser Punkt ist erledigt und funktioniert bestens.

Nun suche ich zu selben Code eine Quelle die mir zeigt, wie ich als nächste Realisierungsvariante, py Code der sich ein eine .py Datei befindet, von einer bash Datei aus aufrufe und wie man in der .py Datei verwendete Variabeln in der .sh Datei verwenden kann. Vom Prinzip her in etwa so etwas:

aufrufende_bash_datei.sh

Code: Alles auswählen

#!/bin/bash

mu = 500
sigma= 50
aufgerufene_py_datei.py

read -p "Zum Beenden Enter drücken oder Ctl + C"
aufgerufene_py_datei.py

Code: Alles auswählen

#!/usr/bin/env python3

# import the required libraries  
import random  
import matplotlib.pyplot as plt  
    
# store the random numbers in a   
# list  
nums = []  
# mu = 500
# sigma = 50
    
for i in range(100):  
    temp = random.normalvariate(mu, sigma) 
    nums.append(temp)  
        
# plotting a graph  
plt.plot(nums) 
plt.show()
 
varialble = input ("Zum Beenden Enter drücken oder Ctl + C")
Benutzeravatar
pillmuncher
User
Beiträge: 1241
Registriert: Samstag 21. März 2009, 22:59
Wohnort: München

Mittwoch 13. Januar 2021, 12:05

Wenn du den Rat befolgen würdest, der dir hier gegeben wurde, und einfach ein Python-Programm schreiben würdest, das dein Problem löst, statt mit einer Mischung aus Bash und Python irgendwas völlig Undurchsuchtiges zusammen zu basteln, dann müsstest du nicht solche Fragen stellen. Aber wenn du dir dein Leben lieber kompliziert machen willst, von mir aus.
In specifications, Murphy's Law supersedes Ohm's.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Mittwoch 13. Januar 2021, 12:16

pillmuncher hat geschrieben:
Mittwoch 13. Januar 2021, 12:05
Wenn du den Rat befolgen würdest, der dir hier gegeben wurde, und einfach ein Python-Programm schreiben würdest, das dein Problem löst, statt mit einer Mischung aus Bash und Python irgendwas völlig Undurchsuchtiges zusammen zu basteln, dann müsstest du nicht solche Fragen stellen. Aber wenn du dir dein Leben lieber kompliziert machen willst, von mir aus.
Nicht jedes über Jahre gewachsene bash Script, lässt sich von jedem in kurzer Zeit in einer fremden Sprache, in diesem Fall .py über Nacht neu schreiben. Daher mein Wunsch, erst einmal nur neue Features in der für mich neuen Sprache .py in bash ein zu binden.
Sirius3
User
Beiträge: 13917
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 13. Januar 2021, 13:26

@Susann.M.23: um Parameter von einem Shell-Skript in ein Python-Programm zu übergeben, gibt es Commandozeilenargumente, das ist ja nicht anders also von einem Shell-Skript zum anderen.
Für die Rückgabe hast Du ja schon ein Beispiel, wie stdout zu parsen.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Mittwoch 13. Januar 2021, 13:34

Sirius3 hat geschrieben:
Mittwoch 13. Januar 2021, 13:26
@Susann.M.23: um Parameter von einem Shell-Skript in ein Python-Programm zu übergeben, gibt es Commandozeilenargumente, das ist ja nicht anders also von einem Shell-Skript zum anderen.
Für die Rückgabe hast Du ja schon ein Beispiel, wie stdout zu parsen.
Inder folgenden Art geht schon mal der Aufruf und die Ausgabe im Terminal (ohne Übergabe von Ein und Ausgabewert)

Code: Alles auswählen

#!/bin/bash

# mu = 500
# sigma= 50

python3 aufgerufene_py_datei.py
# echo $ausgabewert_aus_aufgerufene_py_datei

read -p "Zum Beenden Enter drücken oder Ctl + C"

Jetzt muss ich mal sehen wie ich die Eingabewerte und den Ausgabewert übergeben bekomme.
Susann.M.23
User
Beiträge: 44
Registriert: Montag 30. März 2020, 13:23

Mittwoch 13. Januar 2021, 16:46

Susann.M.23 hat geschrieben:
Mittwoch 13. Januar 2021, 13:34
Jetzt muss ich mal sehen wie ich die Eingabewerte und den Ausgabewert übergeben bekomme.
Nach dem folgenden Muster, geht das was ich machen möchte vermutlich. Allerdings weiß ich es bisher nicht auf meinen Beispielcode an zu wenden:

If not, you can use in-built python module sys to pass arguements to python script and print results directly on terminal.

Code: Alles auswählen

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

Code: Alles auswählen

python script_name.py arg1 arg1
Antworten