即時當前模塊是「top level scripting environment」__main__
,我試圖確定一個函數的實際當前模塊(如果從其他地方導入)。Python:確定實際當前模塊(而不是__main__)
這可能聽起來像一個奇怪的事情,但背景是,我需要序列化一個函數,並在不同的機器上反序列化它(包括參數),爲此我需要確保正確的模塊AND NOT __main__
在反序列化之前被導入(否則我會收到錯誤,說AttributeError: 'module' object has no attribute my_fun
)。
到目前爲止,我已經試過inspection:
import inspect
print inspect.getmodule(my_fun)
這給了我
<module '__main__' from 'example.py'>
當然
。我也嘗試用globals()
找到一些有用的東西,沒有運氣。
我真正想要的是<module 'example' from 'example.py'>
。我想一個哈克的方式將使用什麼文件名解析它像
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
,然後按名稱查找sys.modules[m_name]
模塊。
有沒有更清潔/更好的方法來做到這一點?
編輯: 瞭解IPython中的「FakeModule」和多一點的谷歌搜索後,我來到翻過this post,它描述正是我所面對,包括我目前的解決方案,它(這是明確導入當前模塊的問題import current_module
和序列化current_module.my_fun
而不是my_fun)。我試圖避免這種情況,因爲它可能對我的軟件包用戶來說並不直觀。
你以前看過'nose'庫的內部,特別是'importer'模塊嗎? 「鼻子」做了一些非常相似的東西,所以它可能是一個尋找靈感的好地方。 –