外部ファイルのモジュールはimport my_module
で取得できますが、実行ファイルのモジュールを取得する方法はありますか?
python
1import inspect 2import my_module 3 4print(inspect.getmembers(my_module, inspect.isfunction))
のようにな感じで、inspect.getmembers
の引数に実行ファイルのモジュールを指定したいというモチベーションです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
やりたいことが、
print(inspect.getmembers(my_module, inspect.isfunction))
であるというのを読んでいませんでした。
それでしたら、以下です。
python
1import sys 2import inspect 3 4print(inspect.getmembers(sys.modules[__name__], inspect.isfunction))
ただ、もう一つの質問の回答で書いたように、unknown_userさんが欲しいものが出てくる保証はありません。
python
1>>> import sys 2>>> import inspect 3 4>>> def f(): 5... pass 6... 7>>> from glob import glob 8>>> print(inspect.getmembers(sys.modules[__name__], inspect.isfunction)) 9[('f', <function f at 0x000001EFFD659EE0>), ('glob', <function glob at 0x000001EFFA7D1280>)]
これが起きるのは、globのような標準モジュールの中にもユーザ定義関数globが入っていることと、from モジュール import 名前
を実行したときに、その名前は現在のモジュールのグローバル変数として登録されるためです。
-------------------------------------
以下は関係なかったようですが参考のために残しておきます。
誤りがあったので修正しました。
モジュール名というのが、モジュールの名前属性であるのか、ファイル名であるのかで答えが違います。
モジュールの名前属性であれば、
python
1import sys 2print(sys.modules[__name__].__name__)
です。
$ python - ファイル名.py
の場合は、ファイル名が表示されます。
$ python ファイル名.py
の場合は、常に'main'となっています。
Linuxでファイルに実行属性をつけてて以下のように実行した場合も
$ ./ファイル名.py
常に'main'となっています。
モジュールのファイル名であれば、
$ python ファイル名.py
の場合や
$ ./ファイル名.py
の場合は
python
1import sys 2print(sys.modules[__name__].__file__)
です。
$ python -m ファイル名.py
の場合は
python
1import sys 2print(sys.modules[__name__].__name__)
です。
投稿2021/02/07 22:08
編集2021/02/08 07:12総合スコア24670
0
python
1if __name__ == "__main__": 2 main()
というイディオムを知っていれば分かっているはずですが、実行ファイルのモジュールは常に名前が__main__
です。
https://docs.python.org/ja/3/library/main.html#module-main
追記
したがってそれ以外のモジュールからは常に
python
1import __main__
としてインポートすることができるということです。
循環参照にならないように気をつけなければいけない循環参照を意識する必要があることと、対話環境などでは__main__
は見つからずにエラーになることなどが注意点です。
意図的に循環参照したコードの例
a.py
python
1import b 2 3def x(): 4 return 0
b.py
python
1import __main__ 2 3# この時点でxは未定義なのでエラーになる 4# __main__に含まれる関数を探してもそこにxはない 5print(__main__.x())
投稿2021/02/07 23:44
編集2021/02/09 23:46総合スコア11231
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/08 10:30
2021/02/08 10:34
2021/02/09 23:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/08 10:19