Python - デバッグ - MenuMaker デバッグ
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 を実行することで、パスが通ったわけだ・・・。 後は、なんとかなりそうです。 言語を知らないと、こんなことになりますわなぁ。
#!/usr/bin/env python3.6 import sys; sys.path = ['/usr/local/share/menumaker'] + sys.path import MenuMaker.CLI
> 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)
> 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)
> 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