Listenübergabe mit os.system()?

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.
Antworten
simonsimon
User
Beiträge: 5
Registriert: Mittwoch 18. März 2015, 15:03

Hi,
ich such seit einer halben Stunde eine Möglichkeit, mit Hilfe von os.system eine Liste zu übergeben.
Ich möchte mit Hilfe des os.system's Befehls ein anderes Python Skript starten und ein String und eine Liste übergeben:
os.system("python test.py " +arg+" "+liste)
So funktioniert es nicht..

Wobei arg ein string, und liste eine liste ist.
Ich könnte mir vorstellen, dass die Lösung relativ einfach ist; habe aber bisher leider nichts gefunden. Über Hilfe würde
ich mich sehr freuen!

danke und grüße
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@simonsimon: statt os.system solltest Du die passende Funktion aus dem subprocess-Modul nehmen. Kommandozeilenargumente sind immer Strings, Du kannst also keine Liste übergeben, sondern nur eine Reihe von Argumenten.

Warum willst Du das Python-Programm extern ausführen? Die bessere Alternative ist es, das Skript als Modul zu importieren und die Funktionalität direkt zu benutzen. Dann stellt sich die Frage nach Listen-Übergabe erst gar nicht.
simonsimon
User
Beiträge: 5
Registriert: Mittwoch 18. März 2015, 15:03

Ok, ich versuchs so. Danke!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hallo,

Erstens: Vergiss ``os.system``! Nutze für externe Prozesse das ``subprocess``-Modul. In Deinem Falle sollte ``subprocess.call`` ausreichen.

Zweites: Listen sind eine *interne* Struktur von Python; diese sind anderen Programmen gar nicht bekannt. Wenn Du diese an ein anderes Programm übergeben willst, musst Du diese *serialisieren*. Dafür haben sich eine Menge kluge Leute im Laufe der Zeit standardisierte Formate ausgedacht, wie etwa CSV, JSON, XML, YAML, uvm. Nutze also eines dieser Formate, wenn Du Deine Daten an ein anderes Programm übergeben willst! Python hat dafür auch eingebaute Module; das ``json``-Modul ist kinderleicht zu bedienen.

Evtl. gibt das andere Programm aber auch vor, *wie* die Daten aussehen müssen. Dann musst Du eben gucken, *wie* Du diese auf Python Seite vor dem ``subprocess``-Aufruf in einen String serialisieren kannst.

Und zum Schluss noch eine Gegenfrage: Stammt das andere Programm von Dir und ist das auch in Python geschrieben? Was willst Du global gesehen erreichen? (Also was ist das "big picture"?) Evtl. kann man sich dann nämlich auch dieses ganze Vorgehen sparen und die Funktionalität *direkt* aufrufen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
simonsimon
User
Beiträge: 5
Registriert: Mittwoch 18. März 2015, 15:03

Hi,
ich bin HiWi an einem Institut und soll mit Hilfe von Python Diagramme erstellen und letztendlich als PDF ausgeben.

Das Skript, das ich aufrufen möchte(ich nenn es mal 2), ist ebenfalls von mir und auch in python. Es erstellt mir mit Hilfe von tecplot Diagramme.
Da das 2. Skript recht viele Zeilen hat, möchte ich das 2. zwecks Übersichtlichkeit mit Hilfe vom 1. Skript starten, wobei ich beim 1. Skript angeben will, wieviele Diagramme ich erzeugen will.

Dafür muss ich zum einen sagen, welche Testfälle ich plotten möchte.(Anzahl der Diagramme, übergebe ich derzeit im os.system als einfaches Argument(mit hilfe einer for-schleife))
for profil in profils:
print "loop begin"
os.system("python diagramm_create.py " +profil")

Und zum anderen brauch ich im 2. Skript eine Liste mit Kennlinien-IDs.(Ich benutze im 2. ebenfalls eine for schleife um die Kennlinien zu erzeugen)

Ich bin schon wieder eine Weile am googlen, wie ich das mit dem subprocess Befehl am besten hinbekomme; daraufhin habe ich erst gesehen, dass du, Hyperion, auch noch auf meinen Post geantwortet hast.

Mir würde eine Seite, die mir den subprocess Befehl erklärt wohl am besten helfen :)
Ich suche auf jeden Fall mal weiter, aber vielleicht habt ihr ja einen guten Link!

edit: habe gerade entdeckt, dass du ja schon einen link in zum subprocess Befehl gepostet hast..

sonnigen gruß
simon
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@simonsimon: ein anderes Python-Skript extern aufzurufen ist immer nur eine Notlösung. Wenn Du sowieso das Plot-Skript selbst geschrieben hast, dürfte es ja kein Problem sein, die Plotfunktionen zu importieren und sie direkt mit der Kennlinienliste aufzurufen. Warum willst Du unbedingt den Weg über system/subprocess gehen?
simonsimon
User
Beiträge: 5
Registriert: Mittwoch 18. März 2015, 15:03

Ich stelle mir vor, dass ich als Hauptskript nur 10 Zeilen habe, in dem ich ohne viel Aufwand die gennanten Werte manipulieren kann.
Bzw. auch Leute die davon noch weniger Ahnung haben als ich, die beiden Listen nach ihren Vorstellungen manipulieren können, ohne von dem 2. 100 Zeiligen Code "erschlagen" zu werden.

Ich hoffe es ist klar, was ich meine.
grüße
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dieses Problem löst man durch UIs.
BlackJack

@simonsimon: Das erklärt noch nicht warum Du unbedingt `subprocess` verwenden möchtest statt das andere Modul einfach zu importieren und die Funktion(en) darin zu verwenden.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@simonsimon: es ist doch egal, ob das 100-Zeilenskript importiert wird, oder aufgerufen wird. Im Gegenteil: ein Funktionsaufruf ist auf jeden Fall klarer und einfacher als eine komplizierte Parameterübergabe inklusive umständliches Parsen auf der Gegenseite.
simonsimon
User
Beiträge: 5
Registriert: Mittwoch 18. März 2015, 15:03

Das mit dem Funktionsaufruf kannte ich bisher noch nicht.
Ich habe mir den Kram bisher recht autodidaktisch beigebracht. Ich glaube aber, ich weiß ungefähr was ihr mit
Funktionsaufruf meint. Ich mach mich da mal weiter Schlau!
Auf jeden Fall viele Dank!
Antworten