Ich weiß, dass diese Antwort 4 Jahre zu spät kommt, aber die vorhandenen Antworten führen die Menschen in die Irre.
Der richtige Weg ist, niemals __file__
oder den Versuch, durch sys.path
und suchen Sie nach sich selbst usw. (es sei denn, Sie brauchen Abwärtskompatibilität über 2.1 hinaus).
Es ist die inspect
Modul - insbesondere, getfile
ou getsourcefile
.
Es sei denn, Sie wollen die Regeln (die für CPython 2.x dokumentiert, aber mühsam sind, und für andere Implementierungen oder 3.x überhaupt nicht dokumentiert sind) für das Mapping lernen und implementieren .pyc
à .py
Dateien; Umgang mit .zip-Archiven, Eiern und Modulpaketen; Ausprobieren verschiedener Möglichkeiten, den Pfad zu .so
/ .pyd
Dateien, die nicht unterstützt werden __file__
herauszufinden, was Jython/IronPython/PyPy tut; usw. In diesem Fall, machen Sie es.
Inzwischen ist der Quellcode jeder Python-Version ab 2.0 online verfügbar unter http://hg.python.org/cpython/file/X.Y/
(z.B., 2.7 ou 3.3 ). Sobald Sie also feststellen, dass inspect.getfile(datetime)
ist eine .so
ou .pyd
Datei wie /usr/local/lib/python2.7/lib-dynload/datetime.so
können Sie im Verzeichnis Modules nachsehen. Streng genommen gibt es keine Möglichkeit, sicher zu sein, welche Datei welches Modul definiert, aber fast alle von ihnen sind entweder foo.c
ou foomodule.c
Es sollte also nicht schwer sein zu erraten, dass datetimemodule.c ist das, was Sie wollen.