3

私が試したすべてのデバッガーは、ソース ファイルがデバッグされることを期待しています。ただし、Python は常にこのように機能するとは限りません。

とりわけ、内部にファイル__init__.pyとファイルを含むフォルダーであるモジュールがあり、通常は次のように実行します。__main__.py

$ cd /parent/folder
$ python3 -m module_folder --help

を使用しない-mと、相対インポートが失敗します。pudb、およびその他にフォルダーを渡すだけではpdb、デバッガーは失敗します。

$ cd /parent/folder
$ python3 -m pdb module_folder
Traceback (most recent call last):
  File "/usr/lib64/python3.3/pdb.py", line 1658, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib64/python3.3/pdb.py", line 1536, in _runscript
    with open(filename, "rb") as fp:
IsADirectoryError: [Errno 21] Is a directory: 'module_folder'
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /usr/lib64/python3.3/pdb.py(1536)_runscript()
-> with open(filename, "rb") as fp:
(Pdb)

どうすればこれをデバッグできますか? できればpudb、相対インポートを削除せずに。

4

2 に答える 2

4

これをあなたの一番上に置きます__main__.py

#!/usr/bin/env python3

# Declare itself as package if needed
if __name__ == '__main__' and __package__ is None:
    import os, sys, importlib
    parent_dir = os.path.abspath(os.path.dirname(__file__))
    sys.path.append(os.path.dirname(parent_dir))
    __package__ = os.path.basename(parent_dir)
    importlib.import_module(__package__)

# Continue with your code
do_things()

このようにして、これら 2 つのコマンドは同等になります。

  1. cd /parent/folder; python -m module_folder
  2. python /parent/folder/module_folder/__main__.py

デバッグには 2 番目の構文を使用します。

pudb /parent/folder/module_folder/__main__.py

また

python3 -m pdb /parent/folder/module_folder/__main__.py

同じことが Python 2 でも機能します。

上記のコードからこの部分を安全に削除でき__name__ == '__main__' andます。ただし、それを置くのが一般的な方法です。PEP 366この他の回答を参照してください。__main__.pyTrue

于 2014-01-02T11:02:31.193 に答える
1

私はあなたがこれをしたいと思います:

$ cd /parent/folder
$ python3 -m pdb -m module_folder

実際には、実行するスクリプトの名前であると-mPython に思わせていた秒がありませんでした。module_folder

于 2013-12-23T13:07:03.897 に答える