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
を実行することで、パスが通ったわけだ・・・。
後は、なんとかなりそうです。
言語を知らないと、こんなことになりますわなぁ。
|
|