Ich habe ein Python-Programm, das ich erstelle und das auf zwei Arten ausgeführt werden kann: Die erste besteht darin, "python main.py" aufzurufen, die den Benutzer auf freundliche Weise zur Eingabe auffordert und dann die Benutzereingaben über das Programm ausführt. Die andere Möglichkeit besteht darin, "python batch.py -file- " aufzurufen, das alle benutzerfreundlichen Eingabesammlungen durchläuft und die Eingaben einer ganzen Datei in einem Durchgang durch das Programm ausführt .
Das Problem ist, dass beim Ausführen von "batch.py" einige Variablen / Methoden / etc aus "main.py" importiert werden und dieser Code ausgeführt wird:
import main
In der ersten Zeile des Programms tritt sofort ein Fehler auf, da versucht wird, den Code in "main.py" auszuführen.
Wie kann ich verhindern, dass Python den Code aus dem "Haupt" -Modul ausführt, das ich importiere?
quelle
Aufgrund der Funktionsweise von Python müssen Ihre Module beim Import ausgeführt werden.
Um zu verhindern, dass Code im Modul beim Import ausgeführt wird, aber nur bei direkter Ausführung, können Sie ihn folgendermaßen schützen
if
:Möglicherweise möchten Sie diesen Code in eine
main()
Methode einfügen , damit Sie die Datei entweder direkt ausführen oder das Modul importieren und das aufrufen könnenmain()
. Angenommen, dies befindet sich in der Dateifoo.py
.Dieses Programm kann entweder über go
python foo.py
oder über ein anderes Python-Skript ausgeführt werden:quelle
Verwenden Sie das
if __name__ == '__main__'
Idiom -__name__
ist eine spezielle Variable, deren Wert ist,'__main__'
wenn das Modul als Skript ausgeführt wird, und der Modulname, wenn es importiert wird. Also würdest du so etwas machenquelle
Das tust du leider nicht. Dies ist ein Teil der Funktionsweise der Importsyntax, und es ist wichtig, dass dies der Fall ist. Denken Sie daran, dass
def
tatsächlich etwas ausgeführt wird. Wenn Python den Import nicht ausgeführt hat, stecken Sie ohne Funktionen fest.Da Sie wahrscheinlich Zugriff auf die Datei haben, können Sie möglicherweise nachsehen, was den Fehler verursacht. Möglicherweise können Sie Ihre Umgebung ändern, um zu verhindern, dass der Fehler auftritt.
quelle
Fügen Sie den Code in eine Funktion ein und er wird erst ausgeführt, wenn Sie die Funktion aufrufen. Sie sollten eine Hauptfunktion in Ihrem haben
main.py
. mit der Aussage:Wenn Sie dann aufrufen, wird
python main.py
diemain()
Funktion ausgeführt. Wenn Sie importierenmain.py
, wird es nicht. Außerdem sollten Sie dermain.py
Übersichtlichkeit halber wahrscheinlich in etwas anderes umbenennen .quelle
Es gab einen Python-Erweiterungsvorschlag PEP 299, der darauf abzielte, die
if __name__ == '__main__':
Redewendung durch zu ersetzendef __main__:
, der jedoch abgelehnt wurde. Es ist immer noch eine gute Lektüre, um zu wissen, was bei der Verwendung zu beachten istif __name__ = '__main__':
.quelle
Sie können Ihre "main.py" folgendermaßen schreiben:
quelle
Obwohl Sie nicht verwenden können,
import
ohne den Code auszuführen; Es gibt eine ziemlich schnelle Möglichkeit, Ihre Variablen einzugeben. mit usingnumpy.savez
, das Variablen als numpy-Arrays in einer .npz-Datei speichert. Anschließend können Sie die Variablen mit ladennumpy.load
.Eine vollständige Beschreibung finden Sie in der Scipy-Dokumentation
Bitte beachten Sie, dass dies nur für Variablen und Arrays von Variablen der Fall ist und nicht für Methoden usw.
quelle
Versuchen Sie einfach, die benötigten Funktionen aus main.py zu importieren. So,
Es kann sein, dass Sie eine Funktion in batch.py genauso benannt haben wie eine in main.py, und wenn Sie main.py importieren, führt das Programm die Funktion main.py anstelle der Funktion batch.py aus. Wenn Sie dies tun, sollte dies behoben sein. Ich hoffe.
quelle
import main
importiert NICHT alles von main in den aktuellen Namespace. Es wird nur ein einzigesmain
Symbol in den aktuellen Namespace eingefügt, sodass keine Kollisionen auftreten können.