I'm trying to determine the actual current module of a function (as seen if imported from elsewhere), even if the current module is the "top level scripting environment" __main__
.
It may sound like a weird thing to do, but the background is that I need to serialize a function and unserialize it (including arguments) on a different machine, for which I need to make sure the correct module AND NOT __main__
is imported before deserializing (otherwise I get an error saying AttributeError: 'module' object has no attribute my_fun
).
So far, I've tried inspection:
import inspect
print inspect.getmodule(my_fun)
which gives me
<module '__main__' from 'example.py'>
of course. I also tried finding something useful using globals()
, no luck.
What I really want is <module 'example' from 'example.py'>
. I suppose a hacky way would be to parse it from the file name using something like
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
and then find the module by name sys.modules[m_name]
.
Is there a cleaner/better way to do this?
EDIT:
After learning about ipython's "FakeModule" and a bit more googling, I came accross this post, which describes exactly the problem that I'm facing, including my current solution to it (which is explicitly importing the current module import current_module
and serializing current_module.my_fun
instead of my_fun). I'm trying to avoid this, as it might not be intuitive for the users of my package.
I actually ran across this same problem.
What I used was:
return os.path.splitext(os.path.basename(__main__.__file__))[0]
Which is effectively the same as your "hack." Honestly, I think its the best solution.