Próbuję określić aktualny moduł prądowy funkcji (jak widać, jeśli został zaimportowany z innych źródeł), nawet jeśli bieżącym modułem jest "top level scripting environment" __main__
.Python: określ rzeczywisty moduł prądowy (nie __main__)
Może to zabrzmieć dziwnie, ale tło polega na tym, że muszę serializować funkcję i odserializować ją (w tym argumenty) na innej maszynie, dla której potrzebuję upewnić się, że właściwy moduł ORAZ NIE __main__
jest importowany przed deserializacją (w przeciwnym razie pojawia się komunikat o błędzie: AttributeError: 'module' object has no attribute my_fun
).
Dotychczas próbowałem inspection:
import inspect
print inspect.getmodule(my_fun)
który daje mi
<module '__main__' from 'example.py'>
oczywiście. Próbowałem również znaleźć coś użytecznego przy użyciu globals()
, bez powodzenia.
Tym, czego naprawdę chcę, jest <module 'example' from 'example.py'>
. Przypuszczam hacky sposób byłoby analizować je z nazwy pliku przy użyciu coś jak
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
a następnie znaleźć moduł według nazwy sys.modules[m_name]
.
Czy istnieje lepszy/lepszy sposób na zrobienie tego?
EDIT: Po zapoznaniu się z „FakeModule” ipython i nieco więcej googling, doszedłem po drugiej this post, który opisuje dokładnie problem, że jestem stoi, w tym mojego obecnego rozwiązania nią (co jest wyraźnie importującego aktualny moduł import current_module
i serializowanie current_module.my_fun
zamiast my_fun). Próbuję tego uniknąć, ponieważ może to nie być intuicyjne dla użytkowników mojego pakietu.
Czy patrzyłeś kiedyś na elementy wewnętrzne biblioteki 'nose', a konkretnie na moduł' importer'? 'nose' ma kilka rzeczy bardzo podobnych do tego, więc może być dobrym miejscem do szukania inspiracji. –