2016-07-06 9 views
0

Beim Lesen einer Python-basierten Software bin ich verwirrt über eine Zeile mit Python-Code: path = sys.modules[self.__class__.__module__].__file__.Verstehen und testen [self._class _._ module _] ._ file_

Ich kann erraten, es wurde versucht, den Dateinamen in der Klassendatei zurückzugeben, aber ich bin nicht sehr klar über die genaue Verwendung von diesem. Ich speicherte das verwandte Code-Segment in einer Datei mit dem Namen test.py und ich versuche, es durch python test.py zu testen, aber es druckt nichts. Wie kann ich diese Art von Datei testen?

import os 
import sys 

class testloadfile: 
    def __init__(self, test_path=None): 
    if test_path is None: 
     path = sys.modules[self.__class__.__module__].__file__ 
     # print path 
     path = os.path.abspath(os.path.join(path, os.pardir)) 
     # print path 
     path = os.path.join(path, "test.r") 
     print(path) 
     test_path = path 

    print("r file loaded") 
+0

Offhand, ich sehe hier keine "Main" -Routine ", die eine * Kommandozeilen (!) * Ausführung von' Python "erwarten würde. Hier definieren Sie "eine Klasse", und Sie definieren einen Konstruktor für diese Klasse, * und * es scheint, dass Sie auch eine 'print'-Anweisung eingefügt haben, aber ich sehe hier nichts, was' python' sagt was getan werden soll, wenn diese '.py' Datei von der Kommandozeile ausgeführt wird. Daher bin ich nicht überrascht, dass es nichts tut. **: -) ** "Geh jetzt, und sieh dir das an", bei einem existierenden Python * (Bibliothek) * Code. Beachte, was sie tun, und tue auch dich. –

+0

Das ist wirklich bizarr ... Es scheint, als würde 'sys.modules [self .__ class __.__ Modul __] .__ file__' Ihnen einfach' __file__' geben ... – mgilson

+0

Was ist die richtige Einrückungsebene des endgültigen 'print'? Ist es Teil der 'class' Definition oder Teil der' __init __() 'Methode - weil es wie gepostet ein Einrückungsfehler ist. – martineau

Antwort

0

Klassen in Python ein __module__ Attribut, das den Namen des Moduls enthält, in dem die Klasse definiert wurde. Darüber hinaus enthält jedes Modul ein __file__-Attribut, das den vollständigen Pfad zu der .py-Datei enthält.

Er versucht, den Dateipfad für die Datei zu erhalten, in der die Klasse definiert wurde, aber er ist nicht der beste Weg, geht es mit dem Tun, im Idealfall könnte man Index nur sys.modules von __name__ mit:

path = sys.modules[__name__].__file__ 

statt durch die Klasse gehen (zB self.__class__.__module__ == __name__). Beachten Sie hier, dass if __name__ == "__main__" dies fehlschlägt, da das __main__ Modul kein __file__ Attribut definiert hat. Sie werden gegen sie schützen müssen:

path = sys.modules[__name__].__file__ if __name__ == "__main__" else __file__ 

wo if __name__ == "__main__" dann __file__ den Pfad der Datei ausgeführt wird, enthalten wird.

nächstes die übliche Klausel in Ihrem Skript hinzufügen, um für sie das Objekt initialisieren, wenn das Skript als __main__ ausgeführt wird:

if __name__ == "__main__": 
    testloadfile() # initialize 

Nun, wenn Sie es als das mit __main__ Skript aufrufen:

python -m test.py 

oder wenn Sie import es, wird es das __file__ Attribut abholen, drucken Sie es und drucken Sie dann den Dateinamen.

P. s: Fixieren Sie die Einrückung in Ihrem endgültigen print.