In Python kann ich das Haupt- () eines importierten Moduls anrufen?

In Python habe ich ein Modul myModule.py wo ich definiere ein paar Funktionen und eine main () , die ein paar Kommandozeilenargumente nimmt.

Ich nenne normalerweise diese Haupt- () von einem Bash-Skript. Nun möchte ich alles in ein kleines Paket stellen , also dachte ich, dass ich vielleicht mein einfaches bash-Skript in ein Python-Skript verwandeln und es in das Paket stecken könnte.

Also, wie bekomme ich eigentlich die main () – Funktion von myModule.py aus der main () – Funktion von MyFormerBashScript.py? Kann ich das auch machen? Wie gebe ich irgendwelche Argumente dazu?

5 Solutions collect form web for “In Python kann ich das Haupt- () eines importierten Moduls anrufen?”

Es ist nur eine Funktion. Importieren Sie es und rufen Sie es an:

 import myModule myModule.main() 

Wenn Sie Argumente analysieren müssen, haben Sie zwei Möglichkeiten:

  • Parse sie in main() , aber pass in sys.argv als Parameter (alle Code unten in dem gleichen Modul myModule ):

     def main(args): # parse arguments using optparse or argparse or what have you if __name__ == '__main__': import sys main(sys.argv[1:]) 

    Jetzt kannst du myModule.main(['arg1', 'arg2', 'arg3']) von einem anderen Modul importieren und anrufen.

  • Habe main() akzeptierbare Parameter, die bereits analysiert sind (wieder alle Code im myModule Modul):

     def main(foo, bar, baz='spam'): # run with already parsed arguments if __name__ == '__main__': import sys # parse sys.argv[1:] using optparse or argparse or what have you main(foovalue, barvalue, **dictofoptions) 

    Und importiere und ruf myModule.main(foovalue, barvalue, baz='ham') anderer Stelle und myModule.main(foovalue, barvalue, baz='ham') in python Argumenten nach Bedarf.

Der Trick hier ist zu erkennen, wann Ihr Modul als Skript verwendet wird. Wenn du eine Python-Datei als Haupt-Skript ( python filename.py "__main__" , wird keine import Anweisung verwendet, so python ruft das Modul "__main__" . Aber wenn derselbe filename.py Code als Modul behandelt wird ( import filename ), dann verwendet python das als Modulname stattdessen. In beiden Fällen ist die Variable __name__ gesetzt, und das Testen gegen das sagt Ihnen, wie Ihr Code ausgeführt wurde.

Es hängt davon ab, ob. Wenn der Hauptcode durch ein if wie in geschützt ist:

 if __name__ == '__main__': ...main code... 

Dann nein, du kannst Python nicht ausführen, weil du die automatische Variable __name__ nicht beeinflussen __name__ .

Aber wenn der ganze Code in einer Funktion ist, dann könnte es auch sein. Versuchen

 import myModule myModule.main() 

Das funktioniert auch, wenn sich das Modul mit einem __all__ schützt.

from myModule import * vielleicht nicht sichtbar für dich, also musst du wirklich das Modul selbst importieren.

Martijens Antwort macht Sinn, aber es fehlt etwas Wichtiges, das für andere offensichtlich erscheinen mag, aber es war schwer für mich herauszufinden.

In der Version, in der du argparse benutzt hast, musst du diese Linie im Hauptkörper haben.

 args = parser.parse_args(args) 

Normalerweise, wenn du argparse gerade in einem Skript benutzt hast, schreibst du einfach

 args = parser.parse_args() 

Und parse_args finden die Argumente aus der Kommandozeile. Aber in diesem Fall hat die Hauptfunktion keinen Zugriff auf die Befehlszeilenargumente, also musst du argparse sagen, was die Argumente sind.

Hier ist ein Beispiel

 import argparse import sys def x(x_center, y_center): print "X center:", x_center print "Y center:", y_center def main(args): parser = argparse.ArgumentParser(description="Do something.") parser.add_argument("-x", "--xcenter", type=float, default= 2, required=False) parser.add_argument("-y", "--ycenter", type=float, default= 4, required=False) args = parser.parse_args(args) x(args.xcenter, args.ycenter) if __name__ == '__main__': main(sys.argv[1:]) 

Angenommen, Sie nannten diese mytest.py Um es auszuführen, können Sie entweder eine dieser von der Kommandozeile ausführen

 python ./mytest.py -x 8 python ./mytest.py -x 8 -y 2 python ./mytest.py 

Die jeweils zurückkehrt

 X center: 8.0 Y center: 4 

oder

 X center: 8.0 Y center: 2.0 

oder

 X center: 2 Y center: 4 

Oder wenn du von einem anderen Python-Skript laufen möchtest

 import mytest mytest.main(["-x","7","-y","6"]) 

Die zurückkehrt

 X center: 7.0 Y center: 6.0 

Ich hatte die gleiche Notwendigkeit mit argparse auch. Die Sache ist parse_args Funktion einer argparse.ArgumentParser Objekt Instanz implizit nimmt seine Argumente standardmäßig von sys.args . Die Arbeit um, nach Martijn Linie, besteht aus, dass explizit, so können Sie die Argumente, die Sie an parse_args als Wunsch zu parse_args .

 def main(args): # some stuff parser = argparse.ArgumentParser() # some other stuff parsed_args = parser.parse_args(args) # more stuff with the args if __name__ == '__main__': import sys main(sys.argv[1:]) 

Der Schlüsselpunkt geht an parse_args Funktion. Später, um die Hauptleitung zu benutzen, machst du nur, wie Martijn erzählt.

Angenommen, Sie versuchen, die Kommandozeilen-Argumente auch übergeben.

 import sys import myModule def main(): # this will just pass all of the system arguments as is myModule.main(*sys.argv) # all the argv but the script name myModule.main(*sys.argv[1:]) 
  • Python-Modul mit einem Bindestrich oder Bindestrich (-) in seinem Namen
  • Gibt es irgendwelche Python Bluetooth Module für Windows 7 64 bit?
  • Installiere das Python-Modul mit einer Zip-Datei
  • Einschließlich eines kompilierten Moduls im Modul, das mit f2py verpackt ist (Minimum work example)?
  • Colorama AssertionError in Python 3.2
  • Wie man benutzerdefinierte Python-Paket nach Namen importieren
  • Wie man Python Callbacks mit Fortran mit Modulen aussetzt
  • Wie kann ich den gemeinsamen Code in Python verwenden?
  • PyCharm-Fehler: 'Kein Modul' beim Versuch, eigenes Modul zu importieren (Python-Skript)
  • Python-Modulpfad abrufen
  • Reload (update) eine Moduldatei im Interpreter
  • Python ist die beste Programmiersprache der Welt.