Taggerの起動でImportErrorとwrap_gradio_gpu_callでImportErrorになった時の解消法

# 背景
新PCにStable Diffusion WebUIにtaggerをインストールしたはずが、再起動してもタブで表示されなかった。
コンソールを見てみると、起動時にエラーが起きているようだった。
旧PCの環境では起きなかったのですが…

![FireShot Capture 001 - Stable Diffusion - 127.0.0.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327773/74d06f7e-6458-a21c-abbd-4f7d67229635.png)


# 環境

Windows 11 Home 64-bit
System Model: XPS 8960
Intel(R) Core(TM) i7-13700 (24 CPUs), ~2.1GHz
NVIDIA GeForce RTX 3050 OEM

# エラー内容

## 1つ目
`ImportError: cannot import name 'models_path' from partially initialized module 'modules.shared'`について

```
*** Error running preload() for {パス}\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\preload.py
    Traceback (most recent call last):
      File "{パス}\stable-diffusion-webui\modules\script_loading.py", line 26, in preload_extensions
        module = load_module(preload_script)
      File "{パス}\stable-diffusion-webui\modules\script_loading.py", line 10, in load_module
        module_spec.loader.exec_module(module)
      File "<frozen importlib._bootstrap_external>", line 883, in exec_module
      File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
      File "{パス}\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\preload.py", line 18, in <module>
        from modules.shared import models_path
    ImportError: cannot import name 'models_path' from partially initialized module 'modules.shared' (most likely due to a circular import) ({パス}\stable-diffusion-webui\modules\shared.py)
```

## 2つ目

`ImportError: cannot import name 'wrap_gradio_gpu_call' from 'webui'`について

```
*** Error loading script: tagger.py
    Traceback (most recent call last):
      File "{パス}\stable-diffusion-webui\modules\scripts.py", line 382, in load_scripts
        script_module = script_loading.load_module(scriptfile.path)
      File "{パス}\stable-diffusion-webui\modules\script_loading.py", line 10, in load_module
        module_spec.loader.exec_module(module)
      File "<frozen importlib._bootstrap_external>", line 883, in exec_module
      File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
      File "{パス}\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\scripts\tagger.py", line 5, in <module>
        from tagger.ui import on_ui_tabs
      File "{パス}\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\tagger\ui.py", line 10, in <module>
        from webui import wrap_gradio_gpu_call
    ImportError: cannot import name 'wrap_gradio_gpu_call' from 'webui' ({パス}\stable-diffusion-webui\webui.py)
```

# 解消法

## 1つ目

なんだろう…とおもいググってみると、1つ目は「循環インポート」というもので、他のpyファイルを見てみると循環していると気づきました。


ほかのファイルをいじるよりはtaggerのpyをいじったほうがいいだろう、ということで以下ようにファイルを更新して、解消しました。

### 修正ファイル

```
{パス}\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\preload.py
```

### 修正内容

```
from modules.shared import models_path
```
↓
```
import argparse
import os

modules_path = os.path.dirname(os.path.realpath(__file__))

parser_pre = argparse.ArgumentParser(add_help=False)
parser_pre.add_argument("--data-dir", type=str, default=os.path.dirname(modules_path), help="base path where all user data is stored", )
cmd_opts_pre = parser_pre.parse_known_args()[0]
data_path = cmd_opts_pre.data_dir

models_path = os.path.join(data_path, "models")
```

## 2つ目

ググってもHitせず、偶然見つけた外国の方の記事の質問へのコメントで以下のように修正するといいよとあったので、深くは調べずひとまず変更したら治りました。

なんで治ったかはこれから調べますね…

### 修正ファイル

```
{パス}\stable-diffusion-webui\extensions\stable-diffusion-webui-wd14-tagger\tagger\ui.py
```

### 修正内容

```
from webui import wrap_gradio_gpu_call
```
↓
```
from modules.call_queue import wrap_gradio_gpu_call
```

# すると…

![FireShot Capture 002 - Stable Diffusion - 127.0.0.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327773/1ee67d65-feff-683c-96d6-7bd292c93fcf.png)

見事解消しました。。よかった…。