Werte an ein Shell Script übergeben

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
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Kalli87 hat geschrieben: Ich mein, eingebunden ist er und wird auch gestartet, was nur auffällt ist das die GUI dabei hängen bleibt bis das Script durchgelaufen ist.
Na ist doch klar: Der Prozess dauert eine Zeit lang. Die GUI ruft diese Funktion auf, die wird abgearbeitet und erst *danach* kehrt der Ablauf in die Event-Schleife der GUI zurück. Diese ist für die Dauer von Funktionen gesperrt. Eigentlich klar und logisch.
Kalli87 hat geschrieben: Gut beim nächsten "Testcode" werde ich drauf achten das er "sauber" ist.
Guter Vorsatz! Ich bin gespannt ;-)
Kalli87 hat geschrieben: Zur Formatierungsfrage naja sieht halt so aus und alles in einer Zeile

Code: Alles auswählen

b'PING www.google.de (173.194.116.127) 56(84) bytes of data.\n64 bytes from fra02s27-in-f31.1e100.net (173.194.116.127): icmp_seq=1 ttl=56 time=18.6 ms\n64 bytes from fra02s27-in-f31.1e100.net (173.194.116.127): icmp_seq=2 ttl=56 time=19.0 ms\n\n--- www.google.de ping statistics ---\n2 packets transmitted, 2 received, 0% packet loss, time 1001ms\nrtt min/avg/max/mdev = 18.666/18.836/19.007/0.218 ms\n'
Du hast da die *Repräsentation* eines Bytestrings. Logischer Weise werden bei der Ausgabe davon keine Steuerzeichen wie "\n" ausgewertet, damit man diese als Zeichen *sehen* kann. Du musst die Bytes eben ausgeben... da ``print`` in Python3 aber mit Strings arbeitet (und kein Encoding akzeptiert :evil: ), musst Du Deine Bytes für ``print`` erst in einen String umwandeln, also mit ``decode`` arbeiten. Dann bekommst Du auch tatsächlich saubere Umbrüche.

Deinen letzten Absatz habe ich nicht verstanden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Kalli87: Das bleibt hängen weil das Shell-Skript Benutzereingaben erwartet. Dein Programm soll diese ja liefern, also so das der Benutzer die nicht in der Shell eingeben muss sondern das die von Deinem Python-Programm an die Standardeingabe des Shellskripts geschrieben werden, so als wenn der Benutzer die eingegeben hätte.

Das so auf Modulebene zu schreiben macht nicht wirklich sinnvoll verwendbar. Das sollte in einer Funktion stecken die die notwendigen Angaben als Argumente erhält und dann das Shell-Skript ausführt. Wenn das funkioniert kann man eine GUI schreiben die diese Funktion dann aufruft. *Das* ist das was letztendlich von dem Ausbilder erwartet wird bei so einer Aufgabe.

Du benutzt Python 3 und gibst da ein `bytes`-Objekt aus. Wenn Du das vorher dekodierst und dann den Text ausgibst, werden auch die Zeilenenden als solche behandelt.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Danke!
Wie ich aber schon geschrieben habe hab ich hier im Praktikum keinen "direkten Ausbilder", keiner kann hier Python deswegen is das ganze für mich auch nicht gerade leicht.
Des Weiteren hab ich nächste Woche mal wieder Schule und selbst da kann keiner Python! Steh also recht alleine da was das betrifft und jetzt bin ich an einem Punkt angekommen wo selbst die Bücher die ich hier habe nicht mehr helfen. Es wird einfach kein "subprocess" behandelt, was schon traurig is.

Schönen Abend noch!
BlackJack

@Kalli87: Das Modul ist dokumentiert. Und abgesehen davon ist das ja kein Python-Problem sondern man muss verstehen wie Prozesse und Ein- und Ausgaben zusammenhängen und dann zwei Prozesse so verbinden das der eine Eingabedaten zum anderen schickt.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@BlackJack: Das es in der Offiziellen Dokumentation steht weiß ich, hab ich auch offen.
Nur hätte die gern auf deutsch ^^ ich hab mit englisch an sich keine großen Probleme nur bei solchen Sachen wäre mir eine alternative in deutsch lieber.
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Die Grundlagen von Ein- und Ausgaben sind am ehesten noch in Büchern über die Shell beschrieben. Ich weiß nicht ob dieses Openbook etwas taugt: http://openbook.rheinwerk-verlag.de/she ... rammierung. Aber da Du was auf deutsch und am besten viel lesen willst, kannst Du es ja mal ausprobieren, ob es Dir hilft.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@Kalli87: Wieso musst Du denn dann Python lernen? Anscheinend spricht das ja niemand in Deinem Umfeld! Gäbe es vielleicht eine Alternative, die in Deiner Firma mehr Nutzen hat? (Wobei man an den Fähigkeiten der Leute da schon zweifeln darf, nachdem man die Aussagen zur Aufgabe und das Shell-Script gesehen hat... :mrgreen: )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Hyperion: man lernt ja nicht für sein Praktikum sondern für's Leben. :P
Die Frage ist natürlich berechtigt, wer die Programme warten soll, wenn das Praktikum zu Ende ist. Aber das ist ja nicht das Problem des OP.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Macht euch nur lustig :D
Warum ich Python lernen soll? Liegt daran da mein Praktikumschef das so will.

Danke für den Link Siuris3
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sirius3 hat geschrieben:@Hyperion: man lernt ja nicht für sein Praktikum sondern für's Leben. :P
Python zu lernen ist natürlich an sich ein Wert :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ich glaub ich geb mich geschlagen :?
Ich schaff maximal das einbinden des Scripts und das es startet. Alles was danach gemacht werden soll wie die Eingabe abfangen/nutzen keine Ahnung :K

An sich find ich es auch verwirrend wenn ich das Script eingebunden habe und beim testen wird das Script geladen da fragt er eh nach der Eingabe.
Wie soll das dann eigentlich gehen wenn ich es ohne GUI schreiben soll? (Für den Anfang)
Ein zusätzliche Eingabe von Werten is doch an sich überflüssig das das Script doch selbst schon danach fragt.

Ich weiß das ich Popen, stdout, stdin und vllt noch stderr brauch aber wie das in Kombination aussehen soll, bin ich komplett überfragt.

HILFE
BlackJack

@Kalli87: Die Frage von dem Skript muss der Benutzer ja nicht sehen, die kann man umleiten, und die Antwort muss ja nicht vom Benutzer kommen, die kann auch von Deinem Programm kommen. Du müsstest halt alle Antworten die das Skript erwartet über den entsprechenden Kanal an das Skript übertragen. Du kennst ja die Fragen und die Reihenfolge, also kannst Du auch einfach in genau der Reihenfolge die Antworten senden.

Vielleicht löst Du das am besten tatsächlich erst einmal ohne Python, d.h. Du beschäftigst Dich mit Pipes in der Shell, wie man da die Ausgaben eines Programms umleitet so dass man sie nicht mehr sieht, und zum Beispiel den Inhalt einer vorbereiteten Textdatei mit den Antworten die das Programm erwartet an das Skript umleitet. Wenn Du diese Zusammenhänge verstanden hast, kannst Du das auch mit Python und `Popen` machen und statt die Antworten aus einer extra Datei zu lesen diese direkt vom Python-Programm aus senden. Und wenn das funktioniert, schreibst Du eine GUI welche diese Funktion mit Daten aufruft die der Benutzer eingegeben hat.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

BlackJack hat geschrieben:@Kalli87: Die Frage von dem Skript muss der Benutzer ja nicht sehen, die kann man umleiten, und die Antwort muss ja nicht vom Benutzer kommen, die kann auch von Deinem Programm kommen. Du müsstest halt alle Antworten die das Skript erwartet über den entsprechenden Kanal an das Skript übertragen. Du kennst ja die Fragen und die Reihenfolge, also kannst Du auch einfach in genau der Reihenfolge die Antworten senden.
Stell dir vor das Stück hab ich geschafft :D
Der Link den Sirius3 gepostet hatte hab ich genauer unter die Lupe genommen und konnte so alles durch arbeiten :)
Ergebnis:

Code: Alles auswählen

bash DVMERGE.sh < eingabe.txt > ausgabe.txt > error.txt
Damit Script gestartet, eingabe.txt hat das was der Benutzer hätte eingeben können, in ausgabe.txt wird das Ergebnis eingetragen und in error.txt landen die Fehlermeldungen. :mrgreen:

Ich hoffe mal das du das so gemeint hattest!? Ich bin damit ganz zufrieden.

Alles ohne Python!
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: jetzt mußt Du nur noch die Ein- und Ausgabedateien durch Operationen auf stdin und stdout von popen ersetzen. Noch ein paar Sicherheitsüberprüfungen, ich weiß ja nicht ob dvmerge noch irgendwelche Fehlermeldungen ausspucken kann, prüfen, ob cp auch ordnungsgemäß ausgeführt worden ist, und schon bist Du fertig und kannst Dich an die GUI machen.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Code: Alles auswählen

import subprocess

proc = subprocess.Popen(['bash', '/DVMERGE/DVMERGE.sh'], stdin=open('/DVMERGE/eingabe.txt'))
proc.communicate()
Ok, so klappt das auch schon mal :D
@Sirius3: Was meinst du mit "cp"?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Na das Script kopiert doch als einen Schritt eine Datei irgend wo hin. Das sollte man evtl. überprüfen, um dem Benutzer später ein sicheres Feedback darüber geben zu können, ob das ganze erfolgreich war ;-)

Ich vermute mal, das war mit dem Hinweis gemeint...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

Ach so! Ja is richtig aber das kann ich so nicht richtig testen, da das auf meinem System nicht installiert/eingerichtet oder was auch immer ist.
Ich schreib morgen die GUI und das Script fertig und lass das ganze dann vom Chef durch testen.

Ich muss sagen der Tip von BlackJack beim, ich sag mal, Ur-Schleim anzufangen war sehr gut!
Danke dafür :)
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: das hatte ich befürchtet. Bisher sind die von Dir gezeigten Zeilen erst der aller erste Anfang. Jetzt schon wieder mit GUI loszulegen ist viel zu früh. Wo ist die Funktion, die Du irgendwann später in Deiner GUI verwenden willst? Wo ist die Kommunikation direkt mit dem Skript ohne feste Datei? Wo ist die Ausgabeüberprüfung des Skripts? Was passiert wenn das Bash-Skript irgendwo hängen bleibt?
Meine jetzige Version hat über 40 Zeilen, wobei die Prüfung des intern aufgerufenen dvmerge noch gar nicht berücksichtigt ist, weil ich dieses Programm nicht kenne, und das Prüfen, ob der cp-Befehl funktioniert hat, ohne ändern des Skripts gar nicht 100% zuverlässig funktionieren kann.
Kalli87
User
Beiträge: 281
Registriert: Montag 10. November 2014, 11:27

@Sirius3: Mein Plan ist jetzt eigentlich das in der GUI die Sachen abgefragt werden die nötig sind für das Script. Diese abgefragten Werte wollte ich in einer Datei speichern, nach dem speichern soll das Skript ausgeführt werden und die Werte aus der gespeicherten Datei entnehmen. Ist vielleicht nicht "die" beste Lösung aber eine Lösung die mich weiter bringt.

Die GUI hatte ich schon fertig, nur die "Verknüpfung" zum Script fehlt noch und paar kleinere Funktionen.

Und wenn ich Code mal wieder posten sollte muss ich den erst mal sauber schreiben, danach kann ich ihn gerne posten und wir können über mögliche Änderungen diskutieren. Deal :?:
Sirius3
User
Beiträge: 18264
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalli87: Die blödsinnigen Ja/Nein-Abfragen lassen darauf schließen, dass das, was dvmerge macht, unter Umständen weitreichende Folgen hat. Es wurde einmal eine Waltraud Müller und einmal eine Waltraud Müler mit gleichem Wohnort und Geburtsdatum in der Datenbank gefunden und nun sollen die beiden Datensätze zusammengeführt werden. Was das dreimalige abnicken von zwei Nummern mehr an Sicherheit bringen soll, frag mal Deinen Chef, aber das ist ja eine andere Geschichte.

Ich habe den Eindruck, dass Deine bisherige Vorgehensweise beim Programmieren weniger den Aspekt Sicherheit im Blick hat. Ein "tut doch" reicht bei weitem nicht aus, wenn es darum geht, die Akte eines Krebspatienten mit einer Blindarm-OP zu verschmelzen.

Ich halte das bisherige Programm schon für Schrott. Wie ich weiter oben schon geschrieben habe, sind über 40 Zeilen nötig um zu prüfen, ob das Programm auch das tut, was es soll, aber nur 10 Zeilen um die Funktionalität in Python nachzuprogrammieren. Wenn ich nur zwei Zahlen sehe, kann ich nicht sagen, ob ich mir "sicher" bin. Da appelliere ich an Dich, biete doch einen Mehrwert in Deiner GUI und zeig zu den Nummern wenigsten noch die Namen an, oder irgendetwas mehr an Information, wo man tatsächlich mehr Sicherheit bekommt, und Zahlendreher einfach entdeckt.
Antworten