はじめに
vscodeで、以下のようなフォルダ構成のプロジェクトを作りたいなと思ったとき、例えばtests/test_codes/配下に配置するテストコードからapp配下をimportして実行するようなテストコードを書こうとしても、appが見つからなくてimortできない、ということに陥る。
-- project root/
 |-- app/     # ★テスト対象
 | |-- app.py
 | |-- ... (いろんなファイルやモジュール)
 | |-- ... (略)
 | `-- ... (略)
 |-- tests/   # テスト関連
 | |-- test_codes/      # テストスクリプト
 | | |-- ... (いろんなテストファイルやモジュール)
 | | |-- ... (略)
 | | `-- ... (略)
 | |-- test_utilities/  # ★テストを便利にするスクリプト用モジュール
 | | |-- ... (いろんなファイルやモジュール)
 | | |-- ... (略)
 | | `-- ... (略)
例えばPyCharmの場合では、Projectのパネルからappディレクトリを右クリックして「Mark Directory as > Sources Root」すればPYTHONPATHが通るので簡単なのだが、同じことをvscodeでも実現して、一つのプロジェクトとして操作しやすくするにはどうしたらいいか?
方針
appを参照したいプログラムでPython的にsys.path.append()を使ってパスを通すというのは、煩雑だし、不必要な依存関係を作ったりVSCode自体がこれを認識しない可能性がある(Ctrl-左クリックで当該スクリプトに飛べない可能性がある)のでナシの方向で。
tests/配下のスクリプトからapp/にパスが通っている、ということには、自分の使い方の場合(Pluginにはms-python.pythonを、ターミナルにはpwshを使用)、2パターンの問題を解決する必要があるようでした。
- VSCodeが
app/をPYTHONPATHとして認識する - ターミナル(pwsh)が
app/をPYTHONPATHとして認識する 
ということで、それぞれに対して設定をしていこうと思います。
また、どのパスをPYTHONPATHとして識別したいか?については、プロジェクトによるので、プロジェクトディレクトリ内で解決するようにできないかな、と考えています。
設定案
ちょっと調べたところ、以下の方法で行けた。もっと良い方法があればアドバイスいただけると嬉しいです。
vscode向け設定: settings.jsonでappをソースディレクトリに設定
以下にsettings.jsonを作成。
-- project root/
 |-- .vscode/
 | `-- settings.json  # 追加
 |-- app/
 | |-- app.py
以下を追記。
("${workspaceFolder}/app"と書いたほうがいいかも。調べ中。)
{
    "python.analysis.extraPaths": [".", "./app"],
    "python.autoComplete.extraPaths": [".", "./app"]
}
Terminal(pwsh)向け設定: PYTHONPATHを設定するスクリプトを作って力技でappをソースディレクトリに設定
以下のようなを作成。
-- project root/
 |-- misc/
 | `-- setup.ps1  # 追加
 |-- app/
 | |-- app.py
内容は以下のような感じ。
(以下の例はtestsディレクトリも対象にしてます。Windows向けのセパレータです。)
$script_dir = Split-Path -Path $MyInvocation.MyCommand.Path -Parent
$project_root_dir = Resolve-Path -Path (Join-Path -Path $script_dir -ChildPath "..")
$app_dir = Join-Path -Path $project_root_dir -ChildPath "app"
$tests_dir = Join-Path -Path $project_root_dir -ChildPath "tests"
$env:PYTHONPATH="${project_root_dir};${app_dir};${tests_dir}"
vscode向け設定:venvへパスを通す
どうしたらいいのか調べていないのだけど、project root/配下でvenvという名前でvenvを作れば勝手にパスが通ってくれる。
Terminal(pwsh)向け設定:venvへパスを通す
面倒だけど、. venv\Scripts\activate.ps1してる。
.vscode\settings.jsonに以下の設定をしていると、PowerShell Extentionがターミナルを開いたときに自動でvenvを読んでくれる。
{
    // 前略
    "python.defaultInterpreterPath": "${workspaceFolder}\\.venv\\Scripts\\python.exe",
    // 後略
}
設定なし時(何も起きない)
PS E:\Programming\github\some_project>     # なにもおきない
設定あり時
ターミナルを起動するとActivate.ps1がロードされる。
PS E:\Programming\github\some_project> & E:/Programming/github/some_project/.venv/Scripts/Activate.ps1
(.venv) PS E:\Programming\github\some_project> 
