Die einzige Möglichkeit, dieses Problem zu lösen, besteht darin, die internen Importmaschinen selbst zu entführen. Das ist nicht einfach und voller Gefahren. Sie sollten das gralsförmige Leuchtfeuer um jeden Preis meiden, da die Gefahr zu gefährlich ist.
Benennen Sie stattdessen Ihr Modul um.
Wenn Sie lernen möchten, wie Sie die internen Importmaschinen entführen, erfahren Sie hier, wie Sie dies tun können:
Es gibt manchmal gute Gründe, in diese Gefahr zu geraten. Der Grund, den Sie angeben, ist nicht unter ihnen. Benennen Sie Ihr Modul um.
Wenn Sie den gefährlichen Pfad einschlagen, wird ein Problem darin bestehen, dass beim Laden eines Moduls ein 'offizieller Name' angezeigt wird, sodass Python vermeiden kann, den Inhalt dieses Moduls jemals wieder analysieren zu müssen. Eine Zuordnung des 'offiziellen Namens' eines Moduls zum Modulobjekt selbst finden Sie in sys.modules
.
Dies bedeutet, dass, wenn Sie sich import calendar
an einem Ort befinden, jedes importierte Modul als das Modul mit dem offiziellen Namen betrachtet wird calendar
und alle anderen Versuche, import calendar
irgendwo anders, einschließlich in anderem Code, der Teil der Python-Hauptbibliothek ist, diesen Kalender erhalten.
Es ist möglicherweise möglich, einen Kundenimporter mithilfe des imputil-Moduls in Python 2.x zu entwerfen, das dazu führte , dass Module, die aus bestimmten Pfaden geladen wurden, die von ihnen importierten Module in etwas anderem als dem sys.modules
ersten oder ähnlichem nachschlagen . Aber das ist eine extrem haarige Sache, und es wird in Python 3.x sowieso nicht funktionieren.
Es gibt eine extrem hässliche und schreckliche Sache, die Sie tun können, ohne den Importmechanismus anzuschließen. Dies ist etwas, was Sie wahrscheinlich nicht tun sollten, aber es wird wahrscheinlich funktionieren. Es verwandelt Ihr calendar
Modul in eine Mischung aus dem Systemkalendermodul und Ihrem Kalendermodul. Vielen Dank an Boaz Yaniv für das Skelett der Funktion, die ich benutze . Fügen Sie dies am Anfang Ihrer calendar.py
Datei ein:
import sys
def copy_in_standard_module_symbols(name, local_module):
import imp
for i in range(0, 100):
random_name = 'random_name_%d' % (i,)
if random_name not in sys.modules:
break
else:
random_name = None
if random_name is None:
raise RuntimeError("Couldn't manufacture an unused module name.")
f, pathname, desc = imp.find_module(name, sys.path[1:])
module = imp.load_module(random_name, f, pathname, desc)
f.close()
del sys.modules[random_name]
for key in module.__dict__:
if not hasattr(local_module, key):
setattr(local_module, key, getattr(module, key))
copy_in_standard_module_symbols('calendar', sys.modules[copy_in_standard_module_symbols.__module__])