

visual studio で python のデバッグ時だけ実行されるコード書く方法ってないでしょうか？  
c++だとマクロを使えるんですが・・・

環境  
visualstudio 2019  
python 3.6


CC BY-SA 4.0
2020-05-10T00:39:36.150
66474
2020-05-15T02:18:22.630
37297
question
python visual-studio
visual studio で python のデバッグ時だけ実行されるコード書く方法


<https://stackoverflow.com/a/27455446/1979953>

の回答が参考になると思います。

**引用**  
Use `__debug__` in your code:

[code]

    if __debug__:
        print 'Debug ON'
    else:
        print 'Debug OFF'
    
[/code]

Create a script `abc.py` with the above code and then

  1. Run with `python -O abc.py`
  2. Run with `python abc.py`

Observe the difference.

**引用の翻訳**  
`__debug__` が使えます。

[code]

    if __debug__:
        print 'Debug ON'
    else:
        print 'Debug OFF'
    
[/code]

上記コードを `abc.py` という名前で作ります。

  1. `python -O abc.py`
  2. `python abc.py`

で実行すると違いがわかります。


CC BY-SA 4.0
2020-05-10T02:08:17.920
66475
2020-05-10T02:48:23.470
2020-05-10T02:48:23.470
9008
9008
66474
answer


今のところ、@shingo.nakanishi さん回答の方法が一番作業量や性能への影響が少ないものでしょう。

[__debug__](https://docs.python.org/ja/3/library/constants.html#__debug__)

> この定数は、Python が
> [-O](https://docs.python.org/ja/3/using/cmdline.html#cmdoption-o)
> オプションを有効にして開始されたのでなければ真です。
> [assert](https://docs.python.org/ja/3/reference/simple_stmts.html#assert)
> 文も参照して下さい。
>
> **注釈:** 名前 None 、 False 、 True 、 __debug__ は再代入できない
> (これらに対する代入は、たとえ属性名としてであっても SyntaxError が送出されます) ので、これらは「真の」定数であると考えられます。

[-O](https://docs.python.org/ja/3/using/cmdline.html#cmdoption-o)

> __debug__の値を条件とするassertステートメントとコードを削除します。
> コンパイルされた（バイトコード）ファイルのファイル名を、.pyc拡張子の前に.opt-1を追加して拡張します（PEP 488を参照）。
> [PYTHONOPTIMIZE](https://docs.python.org/ja/3/using/cmdline.html#envvar-
> PYTHONOPTIMIZE)も参照してください。

[-OO](https://docs.python.org/ja/3/using/cmdline.html#cmdoption-oo)

> -Oを実行し、docstringも破棄します。
> コンパイルされた（バイトコード）ファイルのファイル名を.pyc拡張子の前に.opt-2を追加して拡張します（PEP 488を参照）。

[PYTHONOPTIMIZE](https://docs.python.org/ja/3/using/cmdline.html#envvar-
PYTHONOPTIMIZE)

> この変数に空でない文字列を設定するのは -O オプションを指定するのと等価です。整数を設定した場合、 -O を複数回指定したのと同じになります。

* * *

しかし、 **最適化オプションを指定していない** ことと **デバッグモードである**
ことは言葉の厳密な意味としては一致していない、いまいちシックリこないとも感じられます。

実行時にオプションを付け忘れるとデフォルトではデバッグモードで動作しているということにもなるので。

そこで Visual Studioということであれば、プロジェクトのプロパティでデバッグモード時の`Script
Arguments`または`Envirinment
Variables`欄に独自に定義したオプションや環境変数を指定することで、類似の効果を出せると考えられます。  
C++のマクロも、こうしたプロジェクトのプロパティで定義設定を変えてコンパイルしている方法です。Pythonはバイトコードにコンパイルされるとは言え、大きくはインタプリタの分類なので、まったく同じには出来ませんが。

[Python コードのデバッグ](https://docs.microsoft.com/ja-
jp/visualstudio/python/debugging-python-in-visual-studio?view=vs-2019)  
[プロジェクトのデバッグ オプション](https://docs.microsoft.com/ja-
jp/visualstudio/python/debugging-python-in-visual-studio?view=vs-2019#project-
debugging-options)

> 既定では、デバッガーは標準的な Python ランチャーを使用してプログラムを起動します。コマンドライン引数も、特別なパスや条件も使用しません。
> スタートアップ オプションはプロジェクトのデバッグ プロパティで変更することができます。デバッグ プロパティにアクセスするには、ソリューション
> エクスプローラーでプロジェクトを右クリックし、 [プロパティ] を選択して、 [デバッグ] タブを選択します。

上記ページからの図の引用

>
> [![VisualStudioPythonDebug](https://i.stack.imgur.com/4eAG7.jpg)](https://i.stack.imgur.com/4eAG7.jpg)

以下のいずれかで独自定義のオプションや環境変数を取得し、その有無や値に応じて処理を変えることが出来るでしょう。

プログラムでの`Script Arguments`の処理方法例

[pythonでコマンドラインアプリケーション作る話](https://gist.github.com/podhmo/f55ad792fb4aa8464042b878e918ec9e)
の最後の方  
[cli.py](https://gist.github.com/podhmo/f55ad792fb4aa8464042b878e918ec9e#file-
cli-py) とか、  
[Pythonでコマンドラインアプリケーションを作るときの雛形](https://qiita.com/Alice1017/items/0464a38ab335ac3b9336)
の  
[argparseを使ったコマンドライン引数の取得](https://qiita.com/Alice1017/items/0464a38ab335ac3b9336#argparse%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E5%BC%95%E6%95%B0%E3%81%AE%E5%8F%96%E5%BE%97)
など。

プログラムでの`Envirinment Variables`の取得方法例

[Pythonのos.getenvとos.environ.getの違い](https://qiita.com/1ntegrale9/items/94ec4437f763aa623965)

> `os.getenv('ENV_VAL')`  
>  `os.environ.get('ENV_VAL')`  
>  `os.environ['ENV_VAL']`


CC BY-SA 4.0
2020-05-15T02:18:22.630
66621
2020-05-15T02:18:22.630
2020-06-17T08:14:45.997
-1
26370
66474
answer