Python: determine actual current module (not __main__)
inspection, python, python-module
Solution
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.
Problem
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.