【VSCode】毎回異なるコマンドライン引数を指定してプログラムを実行する

VSCodeで毎回異なる引数を指定する方法の解説ページアイキャッチ

このページでは、VSCode(Visual Stuido Code)で「プログラム実行時に毎回異なるコマンドライン引数を指定する方法」について解説していきます。

もう少し違う言い方をすれば、今回紹介する方法を用いれば、プログラム起動時に毎回コマンドライン引数に指定する値をユーザーから受け付けるようにすることができるようになります。

コマンドライン引数とは、プログラム自体に渡される引数のことです。

VSCode では、launch.json によりプログラム実行時の設定を行うことができ、"args" に指定したものがコマンドライン引数としてプログラムに渡され、プログラムはこのコマンドライン引数を受け取った状態で実行されることになります。

固定の引数を指定する

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: 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": ["Hello", "World"]
        }
    ]
}

例えば、上記の launch.json で設定した構成 Python: Current File で次の Python スクリプトを実行した場合、

引数を受け取るプログラム

import sys

print(sys.argv[1])
print(sys.argv[2])

結果としては下記のように表示され、launch.json"args" に指定された "Hello""World" を受け取ってプログラムが動作していることが確認できます。

Hello
World

こんな感じで、"args" によりコマンドライン引数を指定することは可能なのですが、上記では指定するコマンドライン引数が固定になるため、コマンドライン引数の指定を変更したい際には毎回 launch.json"args" 部分を変更しなければいけません。面倒ですね…。

ただし、今回紹介する方法を利用すれば、 VSCode からプログラム実行する場合でも、毎回コマンドライン引数を指定することができるようになります。

例えばですが、プログラム起動時に下の図のような入力フォームが表示されるようになり、ここで入力された値をコマンドライン引数としてプログラムに渡した状態で、プログラムが実行できるようになります。

プログラム実行時に引数入力フォームが表示される様子

ですので、動作確認等でコマンドライン引数を頻繁に変更するような場合でも、お手軽に動作確認を行えるようになります。

今回は Python をベースに解説していきますが、変更が必要なのは launch.json だけであり、他のプログラミング言語でも同様の方法で毎回コマンドライン引数を変更できるようにすることができます。

また、launch.json の作り方に関しては下記ページで C言語 のものと Python のものとを紹介していますので、まだ launch.json が無いという方は、下記ページを参考にして作成していただければと思います。

VSCodeでMacOSにC言語デバッグ環境を構築する方法の解説ページアイキャッチVSCodeでMacOSにC言語デバッグ環境を構築

Visual Studio Code で Mac に Python 開発環境を整える

設定すべきこと

まず、プログラム実行時に毎回異なるコマンドライン引数を指定できるようにするためにやるべきことを簡単に説明しておきます。

コマンドライン引数が固定になってしまうのは、"args" に直接コマンドライン引数の値を指定しているからです。この場合、launch.json から(VSCode から)は、指定された値がそのままプログラムに渡されることになります。

コマンドライン引数が固定でプログラムに渡される様子

それに対し、プログラム実行時に毎回異なるコマンドライン引数を指定できるようにするためには、下の図のような流れで launch.json からコマンドライン引数の値をプログラムに渡すようにする必要があります。

ユーザーが指定した値に応じたコマンドライン引数がプログラムに渡される様子

まず、入力変数と呼ばれる変数を作成し、その変数に格納する値をプログラム起動時に毎回ユーザーが指定できるようにします。

さらに、入力変数への値格納後に、launch.json から入力変数に格納されている値を取得し、その取得した値をコマンドライン引数としてプログラムに渡すようにします。

このようにすることで、プログラム実行時に毎回ユーザーがコマンドライン引数を指定することができ、毎回異なった引数をプログラムに渡すことができるようになります。

上記のような流れを実現するのは難しそうですが、下記の2つが行われるように launch.json を変更さえすれば、あとは VSCode 側で上記のような流れを自動的に実現してくれるようになっています。

  • 入力変数を作成する
  • 入力変数の値をコマンドライン引数に指定する

ということで、ここからは上記の2つを行うために launch.json をどう変更すれば良いのかについて解説をしていきたいと思います。

入力変数を作成する

まず、毎回異なるコマンドライン引数をプログラムに指定するようにするためには、入力変数と呼ばれる変数を作成し、その変数の値(文字列)をユーザーから指定できるようにする必要があります。

本章でやることのまとめ図

この入力変数は、下記のように launch.json"inputs" セクションを設けることで作成することができます。

inputsセクションの追加

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: 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": ["Hello", "World"],
        }
    ],
    "inputs": [
        {
            "id": "inputString",
            "type": "promptString",
            "description": "引数とする文字列を入力",
        },
        {
            "id": "selectString",
            "type": "pickString",
            "options": [
                "runserver",
                "migrate",
                "startapp",
            ],
            "default": "migrate",
            "description": "引数を選択してください"
        },
    ]
}

"inputs" セクションは "configurations" セクションと同階層に設け、"inputs" セクションと "configurations" セクションは , で区切る必要があります。

上記の launch.json においては、"id""inputString" という入力変数と "id""selectString" という入力変数の2つを作成しています。それぞれ作成する入力変数の設定は {}, で区切って記述します。

"id" は、各入力変数を識別するための ID であり、変数名みたいなもので、各入力変数に必須の設定になります。この "id" は、使用する入力変数を指定する際に必要になる情報になります。具体的な説明に関しては、後述の 入力変数の値をコマンドライン引数に指定する で行います。

"id" 以外の "type""description" 等は、簡単に言えば、入力フォームの設定に対する指定になります。

特に "type" は、入力フォームの形式を指定するもので、"type" によって、下の図のように直接文字列を入力する形式の入力フォームで入力変数の値を指定してもらったり、

入力変数の値を直接ユーザーに入力してもらう様子

下の図のように選択肢を示すような形式の入力フォームにより入力変数の値を指定してもらうようなことが可能です。

入力変数の値を直接ユーザーに選択肢の中から選択してもらう様子

さらに、この "type" によって、その他に指定が必要な項目も変わってきます。

ここからは、各 "type" について解説していきます。

スポンサーリンク

"type": "promptString":直接入力変数の値を入力してもらう

"type" に "promptString" を指定した場合、先程の例でいうと「直接文字列を入力」してもらうことで、ユーザーに入力変数の値を指定してもらうことになります。

入力変数の値を直接ユーザーに入力してもらう様子

この "type""promptString" を指定した場合は、下記の設定を必須で指定する必要があります。

  • "description":文字列

また、下記の設定をオプションで指定することが可能です(必須ではない)。

  • "default":文字列
  • "password"true or false

"description"

"description" では、入力フォームの説明を指定します。

例えば "description": "引数とする文字列を入力" と指定すれば、入力フォームの下側に、"引数とする文字列を入力" が入力フォームの説明文として表示されるようになります。

"type": "promptString"の時のdescriptionの説明図

"default"

"default" では、入力変数の値の入力フォームに予め表示しておく値を指定します。

例えば "default": "Hello" と指定すれば、予め Hello が入力された状態で入力フォームが表示されることになります。

"type": "promptString"の時のdefaultの説明図

"password"

"password" では、入力変数の値の入力フォームに、入力された文字列をパスワード表示するかどうかを指定します。パスワード表示する場合、入力された文字列が隠されることになります。

"type": "promptString"の時のpasswordの説明図

パスワード表示する場合は "password": true を、パスワード表示しない場合は "password": false を指定します。"password" を指定しない場合はパスワード表示されません。

"type": "pickString":入力変数の値を選択肢から選択してもらう

また、"type" に "pickString" を指定した場合、「選択肢の中から選択」することで、ユーザーに入力変数の値を指定してもらうことになります。

入力変数の値を直接ユーザーに選択肢の中から選択してもらう様子

プログラムが受け取る引数の候補が予め絞られている場合は、この "pickString" が便利だと思います。

この "type""pickString" を指定した場合は、下記の設定を必須で指定する必要があります。

  • "options":文字列の配列
  • "description":文字列

また、下記の設定をオプションで指定することが可能です(必須ではない)。

  • "default":文字列

"options"

"options" では、ユーザーに示す入力変数の選択肢となる文字列を指定します。

例えば下記のように "options" を指定すれば、

optionsの指定例

"options": [
    "runserver",
    "migrate",
    "startapp",
],

下の図のように VSCode からのプログラム起動時に runservermigratestartapp という3つの選択肢が表示されるようになります。

"type": "pickString"の時のoptionsの説明図

あとは、この選択肢の中の1つをユーザーにクリックして選択してもらえば、その選択された文字列をコマンドライン引数としてプログラムが実行されることになります。

"description"

"description" では、入力フォームの説明を指定します。

例えば "description": "引数を選択してください" と指定すれば、入力フォームに、"引数を選択してください" が表示されるようになります。

"type": "pickString"の時のdescriptionの説明図

"default"

"default" では、デフォルトの選択肢を指定します。

例えば "default": "startapp" と指定すれば、選択肢の中で startapp が一番上に表示され、選択肢名に (既定) (英語の場合は (Default))という説明が加わるようになります。

"type": "pickString"の時のdefaultの説明図

(既定) と表示されることで引数として何を選択すれば良いか分からない時に、どの選択肢を選べば良いかが分かりやすくなりますし、選択を受け付けている途中でユーザーが何も選択せずにエンターキーを押した場合にも "default" で指定した選択肢が自動的に選択されるようになります。

また、"default" に指定した文字列が "options" で指定した文字列の中に存在しない場合、"default" の指定は無視されることになります。

入力変数の値をコマンドライン引数に指定する

入力変数を作成した後は、次は実際に入力変数をコマンドライン引数に指定するよう launch.json の変更を行います。

本章でやることのまとめ図

先ほどは "inputs" セクションで入力変数の作成を行いましたが、次は "configurations" セクションの方を変更していきます。具体的には、"configurations" の中の実行構成における "args" を変更し、作成した入力変数の値をコマンドライン引数としてプログラムに渡すようにしていきます。

作成した入力変数をコマンドライン引数としてプログラムに渡すためには、次のように "args" の指定を行います。

argsの設定

"args": ["${input:入力変数のID}"],

"${input:入力変数のID}" を指定することで、"id" を "入力変数のID" とする入力変数の値がコマンドライン引数に指定されるようになります。

例えば、入力変数を作成する で作成した "id": "inputString" の入力変数の値をコマンドライン引数としたい場合は下記のように launch.json を変更します。"args" の指定以外は、入力変数を作成する で示した launch.json と全く同じです。

入力変数を利用するlaunch.json

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: 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": ["${input:inputString}"],
        }
    ],
    "inputs": [
        {
            "id": "inputString",
            "type": "promptString",
            "description": "引数とする文字列を入力",
        },
        {
            "id": "selectString",
            "type": "pickString",
            "options": [
                "runserver",
                "migrate",
                "startapp",
            ],
            "default": "migrate",
            "description": "引数を選択してください"
        },
    ]
}

MEMO

上記は Python の launch.json を想定したものになります

Python 以外の言語を利用している場合、元々の launch.json に対して "args" 部分の追加・変更を行うようにしてください

"args" 指定の部分だけを抽出すると下記になります。

入力変数inputStringの値をコマンドライン引数とする

"args": ["${input:inputString}"],

このように "args" の指定を行なった実行構成を利用してプログラムの実行を行なった場合、プログラム起動時に、まず入力変数 inputString の値をユーザーから受け付けるため、入力変数 inputString"type" 等の設定に基づいた入力フォームが表示されるようになります。

具体的には、上記の launch.json で入力変数 inputString を次のように設定しているため、

入力変数inputStringの設定

{
    "id": "inputString",
    "type": "promptString",
    "description": "引数とする文字列を入力",
},

プログラム起動時には、入力変数 inputString の値の指定をユーザーから受け付けるため、下の図のような入力フォームが表示されることになります(詳細は “type”: “promptString”:直接入力変数の値を入力してもらう をご参照ください)。

入力変数inputStringの値の指定時に表示される入力フォーム

さらに、この入力フォームに文字列を入力してエンターキーを押せば、入力された文字列が入力変数 inputString に格納されます。

さらに、入力変数 inputString に格納された値が取得され、"args": ["${input:inputString}"]${input:inputString} の部分が取得された値に置き換わった状態でプログラムが起動されます。

"args" は前述の通り、コマンドライン引数を指定する設定となりますので、結果的に入力フォームに入力された文字列がコマンドライン引数としてプログラムに渡された状態でプログラムが実行されることになります。

つまり、ここまでの launch.json の変更により、最初に示した下の図の処理の流れが実現できたことになります。

ユーザーが指定した値に応じたコマンドライン引数がプログラムに渡される様子

プログラム実行時には、毎回入力フォームが表示されますので、毎回異なる引数を指定することができます。

また、"${input:入力変数のID}"入力変数のID の部分を変更することで、他の入力変数を利用することもできます。例えば下記のように "args" を指定すれば、入力変数として "id""selectString" である入力変数を利用することになります。

入力変数selectStringの値をコマンドライン引数とする

"args": ["${input:selectString}"],

上記の launch.json で入力変数 selectString を次のように設定しているため、

入力変数selectStringの設定

{
    "id": "selectString",
    "type": "pickString",
    "options": [
        "runserver",
        "migrate",
        "startapp",
    ],
    "default": "migrate",
    "description": "引数を選択してください"
},

プログラム起動時には、入力変数 selectString の値の指定をユーザーから受け付けるため、今度は選択肢が表示されるようになります(詳細は “type”: “pickString”:入力変数の値を選択肢から選択してもらう をご参照ください)。そしてユーザーから選択肢の中の項目を選択してもらうことで、selectString の値の指定を受け付けることになります。

入力変数selectStringの値の指定時に表示される入力フォーム

こちらも、ユーザーからの入力変数の値の指定方法は異なるものの、下図の流れにしたがってユーザーから指定された値をコマンド引数としてプログラムが実行されることになります。

ユーザーが指定した値に応じたコマンドライン引数がプログラムに渡される様子

こんな感じで、"${input:入力変数のID}"入力変数のID 部分を必要に応じて変更すれば、ユーザーからの入力変数の指定の仕方を変更することができます。

また、複数のコマンドライン引数を指定する際に、それぞれのコマンドライン引数の指定方法を切り替えるようなことも可能です。 

例えば下記のように "args" を指定すれば、1つ目のコマンドライン引数として "id""inputString" である入力変数の値、2つ目のコマンドライン引数として "id""selectString" である入力辺数の値が利用されることになります。

異なる入力変数の値をコマンドライン引数とする

"args": ["${input:inputString}", "${input:selectString}"],

この場合、プログラム起動時に、入力変数 inputString の指定を受け付けるために、まず直接文字列を入力する入力フォームが表示されます。

入力変数inputStringの値の指定時に表示される入力フォーム

この入力フォームに入力された文字列が、1つ目のコマンドライン引数となります。

上記の画面でエンターキーを押したあとは、次は入力変数 selectString の指定を受け付けるために、選択肢から選択を行う入力フォームが表示されます。

入力変数selectStringの値の指定時に表示される入力フォーム

ここで選択された文字列が、2つ目のコマンドライン引数となります。

選択肢をクリックして選択を行えば、2つのコマンドライン引数が渡された状態でプログラムが実行されることになります。

こんな感じで、入力変数は複数利用するようなことも可能です。

MEMO

逆に、入力変数が1つの場合、文字列をスペースで区切って2つ引数を指定しようとした場合でも、1つの引数としてみなされてしまうので注意してください

もっと言えば、ここまでコマンドライン引数を指定するための "args" のみに入力変数を利用してきましたが、実は "args" 以外でも入力変数は利用可能です。

例えば下記のように launch.json を作成すれば、実行するプログラム(スクリプト)のファイルパスを毎回ユーザーが指定できるようにすることもできます。

プログラムのファイルパス指定を受け付ける

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${input:inputString}",
            "console": "integratedTerminal",
        }
    ],
    "inputs": [
        {
            "id": "inputString",
            "type": "promptString",
            "description": "実行するファイルのパス",
        },
    ]
}

この場合、毎回ファイルパスを指定する必要が出てくるので逆に面倒になるとは思いますが、入力変数の使い方のイメージを付けるためには良い例かなと思います。

スポンサーリンク

まとめ

VSCode(Visual Stuido Code)で「プログラム実行時に毎回異なるコマンドライン引数を指定する方法」について解説しました!

VSCode はコマンドライン引数が固定になってしまって不便であると思っていた方も多いのではないでしょうか?

今回紹介したように launch.json の変更により、プログラム実行時に毎回異なるコマンドライン引数を指定することができるようになります。

そして、このためには、launch.json で下記の2つを行う必要があります。

  • 入力変数を作成する
  • 入力変数の値をコマンドライン引数に指定する

作成するプログラムによってはコマンドライン引数の指定が毎回必要だと面倒な場合もあると思いますので、複数の実行構成(コマンドライン引数なし・固定・毎回ユーザー受付等)を用意しておき、必要に応じて実行構成を使い分けるのが良いと思います。

いずれにせよ、毎回コマンドライン引数を変更したいような場合は今回紹介した方法が役に立つと思いますので、是非参考にして快適なプログラミングを環境を構築していただければと思います!

同じカテゴリのページ一覧を表示