मैं एक फ़ंक्शन के वास्तविक वर्तमान मॉड्यूल को निर्धारित करने की कोशिश कर रहा हूं (जैसा कि अन्यत्र से आयात किया गया है), भले ही वर्तमान मॉड्यूल "top level scripting environment" __main__
है।पायथन: वास्तविक वर्तमान मॉड्यूल निर्धारित करें (__main__ नहीं)
यह एक अजीब चीज की तरह लग सकता है, लेकिन पृष्ठभूमि यह है कि मुझे एक फ़ंक्शन को क्रमबद्ध करने और एक अलग मशीन पर इसे तर्कसंगत बनाने (तर्क सहित) की आवश्यकता होती है, जिसके लिए मुझे सही मॉड्यूल सुनिश्चित करना होगा और __main__
deserializing से पहले आयात किया जाता है (अन्यथा मुझे 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'>
है। मुझे लगता है कि जिस तरह से एक hacky तरह
m_name = __main__.__file__.split("/")[-1].replace(".pyc","")
कुछ का उपयोग कर फ़ाइल नाम से यह पार्स करने के लिए और उसके बाद नाम sys.modules[m_name]
द्वारा मॉड्यूल को खोजने के लिए होगा।
क्या ऐसा करने के लिए एक क्लीनर/बेहतर तरीका है?
संपादित करें: IPython के "FakeModule" और थोड़ा अधिक Googling के बारे में सीखने के बाद, मैं जो वास्तव में समस्या यह है कि मैं, का सामना करना पड़ रहा है यह करने के लिए मेरे वर्तमान समाधान (जो स्पष्ट रूप से वर्तमान मॉड्यूल आयात कर रहा है सहित वर्णन करता this post करवाते आया था, import current_module
और my_fun के बजाय current_module.my_fun
क्रमबद्ध करना)। मैं इससे बचने की कोशिश कर रहा हूं, क्योंकि यह मेरे पैकेज के उपयोगकर्ताओं के लिए सहज नहीं हो सकता है।
क्या आपने पहले 'आयातक' मॉड्यूल से पहले 'नाक' लाइब्रेरी के आंतरिक भाग को देखा है? 'नाक' कुछ चीजें इस तरह के समान है, इसलिए यह प्रेरणा की तलाश में एक अच्छी जगह हो सकती है। –