Edit: jak OP teraz wspomnieć, że problem jest jednym z względną importu jest korzystna do absolutu, najprostszym rozwiązaniem konkretnego problemu OP jest dodanie na początku modułu from __future__ import absolute_import
co zmienia, że „pierwszeństwo "/ Zamawianie.
Poniższa nadal ma zastosowanie do łaskotki wydaniu dwóch zderzających importu bezwzględne (co nie wydaje się być to, co PO stoi obecnie w obliczu ...):
Po zaimportowaniu modułu o nazwie x
, ten moduł jest zapisany w sys.modules['x']
- zmiana sys.path, jak to robisz, nie zmieni sys.modules. Będziesz także musiał bezpośrednio zmienić sys.modules.
przykład rozważyć:
$ cat a/foo.py
print __file__; import sys; sys.path.insert(0, "b"); del sys.modules["foo"]; import foo
$ cat b/foo.py
print __file__
$ python2.5 -c'import sys; sys.path.insert(0, "a"); import foo'
a/foo.py
b/foo.py
(uruchomione ponownie użyje i pokazać pliki .pyc zamiast na .py te oczywiście).
Nie najczystsze podejście, i oczywiście w ten sposób oryginalny moduł foo jest nieuchronnie niedostępny z zewnątrz (ponieważ jego wpis sys.modules został przemieszczony), ale w razie potrzeby można zagrać kolejne kruche sztuczki (ukryj sys.modules["foo"]
gdzieś przed skasowaniem, po zaimportowaniu innego foo umieść ten moduł gdzieś indziej i przywróć oryginalny sys.modules["foo"]
- itd., itp.), w zależności od Twoich konkretnych potrzeb. (Oczywiście, unikanie zderzeń nazw w pierwszej kolejności prawie zawsze byłoby prostsze niż walcowanie wokół nich w ten sposób ;-).
Zabawna rzecz, przed chwilą otrzymałem wynik odwrotny, gdy robiłem "z {czegoś} importu {coś}" – MitMaro
Nie jestem całkowicie pewien, co próbujesz zrobić. Czy to "cienie" prawdziwego modułu 'sqlalchemy' z własnego, aby inne moduły próbujące zaimportować' sqlalchemy' otrzymały twoje, ale (tylko) twoje mogą uzyskać prawdziwe 'sqlalchemy'? –
Nie, to moduł częściowy większego pakietu. Tak się składa, że wydaje się, że Python wybiera względny import przed bezwzględnym importem. –