Python - デバッグ - MenuMaker デバッグ

 クラウディア
1. 概要
2. mmaker をデバッグする
3. CLI.py をデバッグする
4. import すればよかったのだ

1. 概要

 「Python - MenuMaker 日本語化」の中で、デバッグというよりは、「MenuMaker」の動作を確認したかったので、デバッガで動かしてみました。  中身を見るのに、苦労したので、メモを残しておきます。

2. mmaker をデバッグする

 「MenuMaker」で、直接実行する、「Python」のファイルは、こう書かれています。
#!/usr/bin/env python3.6
import sys; sys.path = ['/usr/local/share/menumaker'] + sys.path
import MenuMaker.CLI

 「/usr/local/share/menumaker」のディレクトリ構成を見てみると

> tree /usr/local/share/menumaker/
/usr/local/share/menumaker/
|-- Config.py
|-- Keywords.py
|-- MenuMaker
|   |-- __init__.py
|   |-- BlackBox.py
|   |-- CLI.py
|   |-- Deskmenu.py
|   |-- FluxBox.py
|   |-- IceWM.py
|   |-- JWM.py
|   |-- OpenBox3.py
|   |-- PekWM.py
|   |-- WindowMaker.py
|   |-- xBox.py
|   `-- Xfce4.py
|-- Paths.py
`-- Prophet
    |-- __init__.py
    |-- Categories.py
    |-- Debian
    |   |-- __init__.py
    |   `-- menu
    |       |-- debian-2.2r5
    |       |-- debian-8.1
    |       |-- ubuntu-5.04
    |       `-- ubuntu-5.10
    |-- Desktop
    |   `-- __init__.py
    `-- Legacy
        |-- __init__.py
        |-- Development.py
        |-- Editor.py
        |-- Emulator.py
        |-- Graphics.py
        |-- Multimedia.py
        |-- Network.py
        `-- Shell.py
 てなことになっております。  一度、デバッグしようとして

> python3.6 -m pdb /usr/local/bin/mmaker -f FluxBox
> /usr/local/bin/mmaker(2)<module>()
-> import sys; sys.path = ['/usr/local/share/menumaker'] + sys.path
(Pdb) n
> /usr/local/bin/mmaker(3)<module>()
-> import MenuMaker.CLI
(Pdb) s
--Call--
> <frozen importlib._bootstrap>(966)_find_and_load()

・・・	略	・・・

  no terminal emulator specified; will use the default
--Return--
> <frozen importlib._bootstrap>(971)_find_and_load()-><module 'Menu...Maker/CLI.py'>
(Pdb)
--Return--
> /usr/local/bin/mmaker(3)<module>()->None
-> import MenuMaker.CLI
(Pdb) n
--Return--
> <string>(1)<module>()->None
(Pdb)
The program finished and will be restarted
> /usr/local/bin/mmaker(2)<module>()
-> import sys; sys.path = ['/usr/local/share/menumaker'] + sys.path
(Pdb)
 あえなく撃沈ですわ。  「step」しようとしたり、「break」をいれようとしたりしたのですが、なんにもかかりゃしない。

3. CLI.py をデバッグする

 はたと思ったのが、「/usr/local/bin/mmaker」は、「import MenuMaker.CLI」だけしているので、「/usr/local/share/menumaker/MenuMaker/CLI.py」を直接、デバッグすればいいのではないかと・・・。

> python3.6 -m pdb /usr/local/share/menumaker/MenuMaker/CLI.py -f FluxBox
> /usr/local/share/menumaker/MenuMaker/CLI.py(1)<module>()
-> import stat
(Pdb) n
> /usr/local/share/menumaker/MenuMaker/CLI.py(2)<module>()
-> import sys
(Pdb)
> /usr/local/share/menumaker/MenuMaker/CLI.py(3)<module>()
-> import os.path
(Pdb)
> /usr/local/share/menumaker/MenuMaker/CLI.py(4)<module>()
-> import MenuMaker
(Pdb)
ModuleNotFoundError: No module named 'MenuMaker'
> /usr/local/share/menumaker/MenuMaker/CLI.py(4)<module>()
-> import MenuMaker
(Pdb)
 とまぁ、うまくいきそうに見えて、「No module named 'MenuMaker'」・・・。  「MenuMaker」がいないのだ。

4. import すればよかったのだ

 で、また、少し考えました。  呼び出し元の「/usr/local/bin/mmaker」で、一番最初にやっている、パスの設定がありますわな。  これを実行すればいいのでは。

> python3.6 -m pdb /usr/local/share/menumaker/MenuMaker/CLI.py -f FluxBox
> /usr/local/share/menumaker/MenuMaker/CLI.py(1)<module>()
-> import stat
(Pdb) import sys; sys.path = ['/usr/local/share/menumaker'] + sys.path
(Pdb) n
> /usr/local/share/menumaker/MenuMaker/CLI.py(2)<module>()
-> import sys
(Pdb)
> /usr/local/share/menumaker/MenuMaker/CLI.py(3)<module>()
-> import os.path
(Pdb)
> /usr/local/share/menumaker/MenuMaker/CLI.py(4)<module>()
-> import MenuMaker
(Pdb)
> /usr/local/share/menumaker/MenuMaker/CLI.py(5)<module>()
-> import Prophet
(Pdb)	以下略
 つまり、デバッガの起動直後に

import sys; sys.path = ['/usr/local/share/menumaker'] + sys.path
 を実行することで、パスが通ったわけだ・・・。  後は、なんとかなりそうです。  言語を知らないと、こんなことになりますわなぁ。
ハイスピードプランメンズミレットJETBOY