よろしくお願いいたします。

以下のようなことを実現したいのですが、main.pyで定義されているfun()をmain.pyがimportしているsub.pyから呼び出したいのですが、やり方はあるのでしょうか？

```

    # main.py
    from sub.py import *
    def fun():
        print('test')
    call_fun() # 'test'を表示したい
    
```

```

    # sub.py
    def call_fun():
        fun() # ここで自分をimportしているmain.pyのfun()を呼び出したい。うまい書き方はるのでしょうか？
    
```

funをcall_fun()に渡せば（例、call_fun(fun)）できそうですが、それはしたくないのです。

また、sub.pyをimportするファイル名は、好きなものにしたいので、例えば、main.pyをmain2.pyにしても動くようにしたいのです。sub.pyのcall_fun()はどのように書けば実現できるでしょうか？

よろしくお願いいたします。
CC BY-SA 4.0
2022-03-05T05:31:08.727
86697
2022-12-12T04:07:05.990
51697
question
python python3
main.pyでimportしているモジュールからmain.pyで定義されている関数を呼び出す方法はあるのでしょうか？
[Is there a way to access parent modules in
Python](https://stackoverflow.com/q/5286210/9014308)  
上記記事の以下の回答を応用すれば出来るようです。  
ただし、多段階の`import`とかされると適用できないかもしれませんね。

> [For posterity, I ran into this also and came up with the one
> liner:](https://stackoverflow.com/a/45895490/9014308)
```

>     import sys
>     parent_module = sys.modules['.'.join(__name__.split('.')[:-1]) or
> '__main__']
>  
```

>
> The `or '__main__'` part is just in case you load the file directly it will
> return itself.

ソースコードは以下のようになるでしょう。

  * `main.py`は`sub.py`を`import`する行を以下に変える。(`.py`を削る)

```

    from sub import *
    
```

  * `sub.py`は上記記事を応用して親モジュールの情報を取得しておき、その関数を呼び出す。

```

    # sub.py
    import sys
    parent_module = sys.modules['.'.join(__name__.split('.')[:-1]) or '__main__']
    
    def call_fun():
        parent_module.fun() # ここで自分をimportしている親モジュールのfun()を呼び出す。
    
```
CC BY-SA 4.0
2022-03-05T06:23:45.470
86698
2022-03-05T06:23:45.470
26370
86697
answer