52144


下記のようにスクリプトが配置されていて、main.pyからhogeフォルダ配下の複数（実際には複数になります。）のスクリプト内の、特定の関数を実行したいです。

[code]

    /
    ├main.py
    └hoge
      ├huga.py
      └piyo.py
    
[/code]

huga.py

[code]

    def execute():
      print('huga_execute')
    
[/code]

piyo.py

[code]

    def execute():
      print('piyo_execute')
    
[/code]

上記の構成の場合に、main.pyからhuga.pyおよびpiyo.pyのexcute関数を実行したいということです。  
勿論それぞれimportすれば実行できますが、そうではなく、動的に実行したいです。  
（hoge配下のスクリプトは増減する可能性があり、main.pyを変更せずに対応したいため。）

main.py

[code]

    import hoge.huga # importでhugaやpiyoは記載しない、
    import hoge.piyo
    
    hoge.huga.execute() # これらを実行したい
    hoge.piyo.execute()
    
[/code]

イメージとしては下記のような感じで、何らかの方法でmodule?の一覧を取得して、そこから固定の関数を実行できればと考えております。

[code]

    list = getModule('hoge') # ['huga', 'piyo']
    for m in list:
      m.execute()
    
[/code]


CC BY-SA 4.0
2019-01-19T16:58:23.020
52121
2019-01-21T00:33:20.700
13022
question
python python3
Pythonでディレクトリ配下にあるスクリプトの特定の関数を実行したい


`importlib` というのを使うと出来るそうです。

[python動的モジュールの読み込み](https://qiita.com/ajitama/items/2ab42e4c7354dcd79266)

[importlib --- The implementation of
import](https://docs.python.org/ja/3.7/library/importlib.html)


CC BY-SA 4.0
2019-01-19T17:33:02.267
52123
2019-01-19T17:33:02.267
26370
52121
answer


sys.modulesとinspectを使用することで実現できましたので回答として投稿いたします。

main.py

[code]

    import sys, inspect
    for name, obj in inspect.getmembers(sys.modules['hoge']):
        if inspect.ismodule(obj):
            obj.execute()
    
[/code]

以下が参考になりましたので記載しておきます。  
<https://stackoverflow.com/questions/1796180>

ただ、これがベストかどうかは自信がありません。  
また、色々試しましたが、importlibで実現はできませんでした。  
kunifさんもコメントしていますが、多分やり方次第でできそうな気もします。こちらを使用してのやり方がありましたら、是非記載していただけると嬉しいです。


CC BY-SA 4.0
2019-01-20T13:58:34.510
52142
2019-01-20T13:58:34.510
13022
52121
answer


私はこんな感じでimportlibで実現しました。  
問題の意味を取り違えていたで、追記しました。

[code]

    import os
    import importlib
    
    path = "./hoge"
    
    files = os.listdir(path)
    modlist = [f for f in files if os.path.isfile(os.path.join(path, f))]
    print(modlist)
    
    # ココにmodlistから拡張子を除去したり、.py以外を弾いたリストに加工する処理
    
    for funcname in modlist:
        plugmod = importlib.import_module("hoge."+funcname)
        ret = plugmod.execute()
    
[/code]


CC BY-SA 4.0
2019-01-20T14:57:49.610
52144
2019-01-21T00:33:20.700
2019-01-21T00:33:20.700
31852
31852
52121
answer