2013-08-10 24 views
8

Pythonパッケージを開発する場合は、-mオプションを使用して、パッケージ内のモジュールをスクリプトとして迅速にテストすることが非常に便利です。例えば、サブモジュールは__main__であるかのようsomepackage存在がsomemodule.pyを実行するディレクトリからPythonデバッガを起動して同時にスクリプトとしてモジュールを実行

python -m somepackage.somemodule 

を呼び出し、それ内部モジュールsomemodule.pysomepackage用。パッケージが明示的な相対インポートを使用している場合には、この呼び出し構文を使用することは特に重要です(here)。

同様に、同時に両方を行うにはどのような方法があります

python -m pdb somescript.py 

のように、また、スクリプトをデバッグする-mオプションを使用すると便利ですか!つまり、モジュールをスクリプトのように呼び出して、デバッガに同時に起動することはできますか?私はコード自体に入り、import pdb; pdb.set_trace()を挿入することができることを理解していますが、私はそれを避けようとしています。

答えて

7

かなりの時間のためにこれを試して後、それはこのアプローチが実際に動作していることが判明した:何らかの理由で

python -c "import runpy; import pdb; pdb.runcall(runpy.run_module, 'somepackage.somemodule', run_name='__main__')" 

は、pdb.runオーバーpdb.runcallの使用が重要です。

+0

pdb.runは、文字列ではなく、呼び出し可能と期待されます。 '' python -c ''インポートrunpy; import pdb; pdb.run(\ "runep.run_module( 'somepackage.somemodule'、run_name = '__ main __')\") "' ' も同様ですが、 – petre

0

コマンドライン引数でも機能する別のオプションがあります。

スクリプトのロジックをmain関数で囲むことは、一般的には良い考えです。その後、mainにオプションの引数リストを取り込んで、sys.argvを上書きすることができます。ここでargdemo.pyと呼ばれる例です:

def main(cmd_line_args=None): 
    import argparse 

    parser = argparse.ArgumentParser() 
    parser.add_argument("number", help="a number", type=int) 

    # allow cmd_line_args to override sys.argv 
    if cmd_line_args is None: 
     args = parser.parse_args() 
    else: 
     args = parser.parse_args(cmd_line_args) 

    print("The number is {}".format(args.number)) 

if __name__ == '__main__': 
    main() 

このモジュールは通常通りに実行することができます:

$ python -m argdemo 2 
> The number is 2 

それとも直接main()を呼び出すことによってpdbで実行することができます:

$ python -c "import pdb; import argdemo; pdb.runcall(argdemo.main, ['2'])" 
(Pdb) continue 
> The number is 2 

(ということに注意してくださいcmd_line_argsは、argvのような文字列のリストでなければなりません)。 @のJEDの答えに

追加ボーナスとして、あなたのモジュールはインポート可能なmain機能を持っているとき、あなたは同じようにそれのためのユニットテストを書くことができますが=)

0

ビルは、私はこのモジュールを内蔵:

import pdb 
import runpy 
import sys 


def main(): 
    module = sys.argv[1] 
    sys.argv[1:] = sys.argv[2:] 
    pdb.runcall(runpy.run_module, module, run_name='__main__') 


__name__ == '__main__' and main() 

はどこでもあなたのPythonパス(カレントディレクトリの作品)でmpdb.pyとしてそのモジュールを入れて、あなたは呼び出すことがあります。

python -m mpdb somepackage.somemodule even with args 
0

0123があります。underwayこれをPython自体で解決するにはPython 3のように見えます。

python -m pdb -m somepackage.somemodule 

と私は古いバージョンのPython(2.7以降)のためa backportを提供してきました::7、あなたが行うことができます

pip install backports.pdb 
python -m backports.pdb -m somepackage.somemodule 
関連する問題