現在のモジュールが「トップレベルのスクリプト環境」__main__
。
奇妙なことのように聞こえるかもしれませんが、その背景としては、関数をシリアル化し、別のマシンでそれを(引数を含めて)シリアル化解除する必要があり、そのためには、シリアル__main__
化解除する前に正しいモジュールがインポートされていること、そして、シリアル化解除されていないことを確認する必要があります(そうでない場合、 というエラーが発生しますAttributeError: 'module' object has no attribute my_fun
)。
これまで試してきたのは検査:
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」について学び、さらにグーグルで検索したところ、この郵便受けこれは、私が直面している問題を正確に説明しており、現在の解決策(現在のモジュールを明示的にインポートしimport current_module
、current_module.my_fun
my_fun の代わりにシリアル化すること)も含まれています。これは、私のパッケージのユーザーにとって直感的ではない可能性があるため、回避しようとしています。
ベストアンサー1
これは時代遅れだとは思いますが、Python3でもっと簡単な解決策を見つけました。簡単に言うと、オブジェクトの_スペック_ は "_ ではなく実際のモジュール名も保存します主要_"。
import inspect
if obj.__class__.__module__ == "__main__":
print(inspect.getmodule(obj).__spec__.name)