VS CodeでPython 3の競プロコードをデバッグ実行


このエントリーをはてなブックマークに追加

AtCoderCodeforcesなどの競技プログラミングサイトでは、通常、標準入力から入力を受け取ります。例えばPythonで回答する場合、あなたの回答(例としてsolve.pyとします)は、入力が書かれたテキストファイルinput.txt

$ python solve.py < input.txt

のように与えられたとき、正しく出力することが求められます。

Visual Studio Codeでは<を使った入力や出力はdebugger/runtime specificということになっています (https://code.visualstudio.com/docs/editor/debugging#_redirect-inputoutput-tofrom-the-debug-target) 。私の理解が正しければ、Pythonを実行する処理系が<をうまく扱えない場合、Visual Studio Code<を使う諦めざるを得ないはずです。実際、Windows + Anaconda Pythonという組み合わせで試行錯誤しましたが、うまくいきませんでした。

このように<を使った入力や出力がうまくいかない処理系を使っている場合であっても、Visual Studio CodePythonデバッグができるような方法を考えました。

手順1. Pythonスクリプトに3行追加

Visual Studio Codeは、以下の形式であれば問題なく引数を受け取ってデバッグ可能です。

$ python solve.py input.txt

そこで、以下のどちらでも同じように入力を受け取れるようにPythonスクリプトを変更します。

$ python solve.py < input.txt
$ python solve.py input.txt

そのためには、Pythonスクリプトに以下の行を入れればOKです(参考: how to take a file as input stream in Python - Stack Overflow )。

import sys


if len(sys.argv) == 2:
    sys.stdin = open(sys.argv[1])

例えば ABC146のB問題ですと、回答は以下のようになります。

import sys


if len(sys.argv) == 2:
    sys.stdin = open(sys.argv[1])

N = int(input())
S = input()
T = ""
for ch in S:
    T += chr(ord('A') + (ord(ch) - ord('A') + N) % 26)
print(T)

手順2. Visual Studio Codeデバッグ実行

事前にPython拡張機能を入れて置く必要があります(多分Pythonで検索して最初に出てくるMicrosoftのものでOK)。

  • Pythonコードを右クリックしてVisual Studio Codeで開きます。

  • 左の方にあるデバッグのアイコンをクリックします。Ctrl + Shift + DでもOKです。

f:id:minus9d:20200723181922p:plain

  • "create a launch.json file." をクリックします。

f:id:minus9d:20200723182544p:plain

  • "Python"を選択します。

f:id:minus9d:20200723182626p:plain

  • "Python File"を選択します。

f:id:minus9d:20200723182700p:plain

  • 自動で作成される雛形に、"args": [/path/to/入力ファイルへのパス] を追加します。パスは、あなたのPythonスクリプトのあるディレクトリを基準とした相対パスでもよいようです。以下に例を示します。
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal",
            "args": ["test/sample-1.in"]
        }
    ]
}
  • Pythonスクリプトのタブを選択して、行番号の左側をクリックしてBreakpointをはります。

f:id:minus9d:20200723183947p:plain

  • さっき作った設定が選ばれていることを確認して、再生ボタンを押します。

f:id:minus9d:20200723183414p:plain

  • Debugしましょう!

f:id:minus9d:20200723183548p:plain