現在のモジュールが「最上位のスクリプト環境」であっても、関数の実際の現在のモジュールを特定しようとしています (他の場所からインポートされた場合に表示されるように) __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)。パッケージのユーザーにとって直感的ではない可能性があるため、これを回避しようとしています。