2010-03-10 16 views
10
from pack.mod import f 

Jak dostać się z obiektu f informacji o imporcie - 'pack.mod'uzyskać ścieżkę import funkcja

mogę dostać go za pomocą f.__module__ ale jeśli funkcja def w module gdzie otrzymuję ten atrybut (f.__module__) zwróci '__main__'. Ale muszę prawdziwą ścieżkę tutaj - 'pack.mod'

Znalazłem ten sposób, aby uzyskać te informacje:

inspect.getmodule(f).__file__ 

wtedy mogę sub rozpocząć ścieżkę od sys.path, wymiany / na . i uzyskać ścieżkę podobnego - 'pack.mod' ale może istnieć w bardziej wygodny sposób?

+2

dlaczego trzeba to zacząć? – SilentGhost

Odpowiedz

12

Co inspect.getmodule(f) robi wewnętrznie, za inspect.py's sources, jest zasadniczo sys.modules.get(object.__module__) - Nie nazwałbym tego kodu bezpośrednio za pomocą „wygodniejsze”, choć (poza „zasadniczo” części inspect ma wiele przydatnych łowienia i korekty futerały narożne).

Dlaczego nie zadzwonić bezpośrednio inspect.getsourcefile(f)?

Edit: czytanie między wierszami, wydaje się, że PO próbuje coś zrobić jak

python /foo/bar/baz/bla.py 

iw bla.py (który jest w ten sposób prowadzony jako __main__) określenia „co from lub import oświadczenie mógł inny główny skrypt do importowania tej funkcji ze mnie? ".

Problem jest, pytanie jest źle postawione, bo nie może być dowolny takie ścieżki wykorzystywane do celów (nic nie gwarantuje ścieżka bieżącego Główny skrypt jest na sys.path kiedy to inny główny skrypt pobiera uruchomić później), nie może być kilka różnych nich (np zarówno /foo/bar i /foo/bar/baz może być on istnieć sys.path i /foo/bar/baz/__init__.py, w którym to przypadku from baz.bla import f i from bla import f może zarówno praca) i nic nie gwarantuje, że niektóre inne, poprzednie sys.path pozycja może nie „wywłaszczyć” próbę importu (np., powiedz /foo/bar/baz jest na sys.path, ale przed i t istnieje również /fee/fie/foo i istnieje również całkowicie niepowiązany plik /fee/fie/foo/bla.py - itd. itp.).

Bez względu na cel tego rodzaju próba odkrycia, sugeruję znalezienie alternatywnej architektury - na przykład jeden gdzie from baz.bla import fjest faktycznie wykonane (jak PO mówi na początku pytanie), tak że f.__module__ jest prawidłowo ustaw na baz.bla.

+0

OK, ale potrzebuję jakiegoś natywnego sposobu, aby uzyskać informacje w formacie gotowym do importowania, a nie ścieżkę pliku, którą muszę przetworzyć dla informacji o wyciągu. Czy istnieje, czy mimo to muszę przeanalizować ścieżkę? – evg

+1

Atrybut '__module__' podaje tę ścieżkę - twierdzisz, że daje' __main__', ale to się nigdy nie stanie, kiedy skończysz, jak również powiesz, 'from path.mod import f' - tylko jeśli ' ponownie uruchamia plik jako główny skrypt zamiast go importować, a instrukcja 'from' oznacza, że ​​** importujesz **, więc' __module__' działa poprawnie. –

+0

Mój cel napisania rejestratora. zawiesiłem go na funkcję dekoratora. Zrzuca on wszystkie argumenty funkcji, które wywoływał z db, nazwę funkcji i nazwę modułu również zapisaną - potrzebuję tej informacji, aby przywrócić wywołanie funkcji później z tymi argumentami na żądanie. Aby przywrócić wywołanie, potrzebuję funkcji wczytującej, i dlatego potrzebuję ścieżki do jej załadowania ... Będę kierował to sys.path zawsze tak samo. Mb Potrzebuję innego sposobu identyfikacji sposobu ładowania funkcji, m.b pełnej ścieżki pliku i nazwy funkcji lepiej ... ale w tym przypadku muszę przeanalizować ścieżkę pliku i sys.path, aby zbudować prawidłową ścieżkę importu ... czy to prawda? – evg

2

Chcesz atrybut __name__ z __module__:

In [16]: import inspect 
In [17]: inspect.getmodule(MyObject).__name__ 
Out[17]: 'lib.objects.MyObject' 
Powiązane problemy