input() aus modul im Hauptcode weiterverarbeiten

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
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Donnerstag 15. Februar 2018, 18:30

Hi Leute,

ich stehe seit ein paar Stunden auf dem Schlauch und komme nicht weiter.

Ich habe ganz einfaches Modul, welches entweder via sys.arg[] Parameter entgegen nehmen soll, oder via input().

Das Modul sieht wie folgt aus:

Code: Alles auswählen

   import sys
  
  
   def get_player():
       if len(sys.argv[1:]) > 0:
           player = sys.argv[1:]
       else:
           player = input()
           player = player.split()
Im Haupteil meines Programms moechte ich die Liste player weiterverarbeiten.

Das player-Modul binde ich wie folgt ein:

Code: Alles auswählen

import lmscontrol.player
Allerdings kann ich mir den Inhalt von lmscontrol.player.get_player() nicht ausgeben lassen. Da kommt dummerweise None zurueck.

Gehe ich von der Denkweise her falsch heran oder mache ich einfach nur im Coding etwas falsch.

Das Modul laesst stand-alone aufrufen und die Liste player ist dann auch mit Werten gefuellt.

z.B:

Code: Alles auswählen

/usb/bin/python3 player.py 'BUERO'
Gibt BUERO aus.

Kann mich da mal bitte jemand in die richtige Spur bringen?

thx und Gruss,
tholle
__deets__
User
Beiträge: 2857
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 15. Februar 2018, 18:34

Du musst den gewuenschten Wert schon mit "return" aus der Funktion bugsieren. Und wenn du mit argv arbeitest, lohnt ein Blick auf das schon eingebaute argparse-Modul, womit sich gleich viel besser arbeiten laesst.
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Donnerstag 15. Februar 2018, 18:44

return hatte ich auch schon versucht. Auch da kommt None zurueck.

Code: Alles auswählen

  import sys
 
 
  def get_player():
      if len(sys.argv[1:]) > 0:
          player = sys.argv[1:]
      else:
          player = input()
          player = player.split()
      return
argparse schaue ich mir an.

Vielen Dank schon mal.

Gruss,
tholle

EDIT:// Funktionert! Muss natuerlich return player heissen. 8) 8)

Argparse habe ich mir angeschaut, aber fuer meinen Anwendungsfall noch keinen Mehrwert gefunden. Ich will beim meinem Programmaufruf einfach nur Playernamen uebergeben, die dann im weiteren Verlauf verarbeitet werden.

z.B:

Code: Alles auswählen

soundtool.py BUERO KUECHE WOHNZIMMER
Diese Parameter (BUERO, KUECHE, WOHNZIMMER) sollen als Liste im Programm soundtool.py landen.
Zuletzt geändert von tholle am Donnerstag 15. Februar 2018, 19:08, insgesamt 1-mal geändert.
Benutzeravatar
noisefloor
User
Beiträge: 2388
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Donnerstag 15. Februar 2018, 19:04

Hallo,

du musst dem `return` auch einen Wert mitgeben, in deinem Fall `player`. Ein nacktes return gibt standardmäßig `None` zurück, wie du ja schon festgestellt hast.

Gruß, noisefloor
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Donnerstag 15. Februar 2018, 19:09

@noisefloor,

vielen Dank. Hatte ich auch gerade herausgefunden. :D

Viele Gruesse,
tholle
Sirius3
User
Beiträge: 7780
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 16. Februar 2018, 08:16

@tholle: vermeide, in tief verschachtelten Modulen so globale Variablen wie sys.argv zu benutzen. Das ist sehr fehleranfällig, falls man mal doch auf die Idee kommt, Programmargumente für etwas anderes zu verwenden.
Normalerweise übergibt man aus dem Hauptprogramm sys.argv an die Funktion, die die Verarbeitung übernimmt:

Code: Alles auswählen

import sys

def parse_args(argv):
    if argv[1:]:
        players = argv[1:]
    else:
        players = input().split()
    return players

def main():
    players = parse_args(sys.argv)
    ...

if __name __ == '__main__':
    main()
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Samstag 17. Februar 2018, 11:24

Vielen Dank fuer den Hinweis.

Ich haette gedacht, man soll so viel wie moeglich modulieren.
So hatte ich angenommen, es waere sinnvoll, in einem eigenen Modul den Player entgegen zu nehmen, und dieses Modul wiederum in den Hauptcode einzubinden, um auf dessen Funktionen zugreifen zu koennen.

Aber generell habe ich echte Schwierigkeiten, mit dem Einbinden von Modulen. Irgendwie blicke ich das nicht so ganz, wann man wie und was einbinden muss. Ich habe nun verschiedene Tutorials und die Python-Doku zum Thema Module mehrfach gelesen und kann das alles beim Lesen auch irgendwie nachvollziehen, aber wenn ich dann die Sachen in meinem Code umsetzen will, klappt das einfach alles nicht.

Ich verstehe einfach nicht wirklich, wann man z.B. from A import B, from .A import B, import B, form A.B import C usw. anwendet.

Ich bin kurz davor den ganz Mist einfach aufzugeben. :oops:

Mir scheint fuer's Programmieren eine Hirnwindung zu fehlen. :K

Gruss,
tholle
Benutzeravatar
kbr
User
Beiträge: 853
Registriert: Mittwoch 15. Oktober 2008, 09:27

Samstag 17. Februar 2018, 13:40

tholle hat geschrieben:Ich verstehe einfach nicht wirklich, wann man z.B. from A import B, from .A import B, import B, form A.B import C usw. anwendet.

Ich bin kurz davor den ganz Mist einfach aufzugeben.

Mir scheint fuer's Programmieren eine Hirnwindung zu fehlen.
Die verschiedenen import statements machen alle das gleiche: sie binden ein Modul als Namensraum ein. Sie unterscheiden sich aber darin, wie das Modul gefunden wird und wie es später als Namensraum erreichbar ist.

Falls Du der Ansicht bist, dass Programmieren nicht Dein Ding ist, dann gebe ruhig mit gutem Gewissen auf. Das ist kein Manko, sondern geht vielen Menschen so. Deren Stärken liegen dann oft in Bereichen, die andere weniger gut können.
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Samstag 17. Februar 2018, 14:07

Aufgeben ist dann doch irgendwie uncool.

Ich habe mittlerweile herausgefunden, was mir bei dem Thema import Schwierigkeiten gemacht hat.
Was import genau tut, war mir schon irgendwie klar, nur eben nicht, welche Art der Importmoeglichkeiten man wie/wann einsetzt.

Entscheidend ist, von wo aus man das Modul/Paket sucht (ich glaube, das ist, was du meinst mit "... wie das Modul gefunden wird..."). Oder mit anderen Worten, ob das Programm, in welchem die Module eingebunden werden sollen, im Ordner wie die Module liegt, oder eine Ebene hoeher. Und ob man aus einem Modul eine selektive Funktion, bzw. Methode importieren will, oder das ganze Modul, inklusive all seiner Funktionen/Methoden, Classen, Attribute, etc.

Wenn das erst einmal klar ist, dann geht's auch weiter.

thx und Gruss,
tholle
Tholo
User
Beiträge: 51
Registriert: Sonntag 7. Januar 2018, 20:36

Sonntag 18. Februar 2018, 09:02

@Tholle

Ich war auch immer der Ansicht, dass das Coden oberhalb mein Verständnisses ist.
Schau mal auf https://www.udemy.com (warten bis die bei Anboten zwischen 10-15$ Kosten)und Youtube dort gibt es Python Webinare in Deutsch.
Das hat mir geholfen.
Klar benötigt man für "Kleinigkeiten" wie das Importieren von Modulen manchmal Stunden, was andere in paar Minuten machen.
Aber das ist halt so.

Mein erstes Projekt hat mittlerweile 100 Zeilen Code (in verschiedenen) und wenn du eine Funktion gangbar gemacht hast, dann freut man sich darüber.

Ich würde dir auch Pycharm als IDE empfehlen. Da die Textvervollständigung viele die Fehler nicht zulässt und man ein evtl. argen gleich erkennt.
tholle
User
Beiträge: 29
Registriert: Donnerstag 7. Juli 2011, 13:51

Sonntag 18. Februar 2018, 09:39

Hi Tholo,

danke fuer's Mutmachen.

Auf udemy.com habe ich mir Anfang Januar den Kurs von Jannis Seeman (Python Bootcamp) gekauft. Finde ich an sich auch ganz gut, nur geht er genau bei dem Thema Module/Pakete etwas schnell drueber. Ich habe aber den kompletten Kurs noch nicht durch.

Als IDE nutze ich iPyhton3. Zumindest, wenn ich mal etwas Code ausprobieren will. Zum eigentlichen Coden nutze ich VIM mit dem YCM-Plugin (YouCompleteMe). Macht im Grunde das Selbe wie Pycharm.

Vim nutze ich, weil ich remote programmiere. Heisst, ich entwickle auf einem entfernten Rechner, nicht lokal.

Viele Gruesse,
tholle
Antworten