【Python】上の階層のpyファイルをimportする

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【Python】上の階層のpyファイルをimportする

2024-2-13 | ,

Pythonで上の階層のpyファイルをimportしたい!

概要

今回の記事では、Pythonで上の階層のpyファイルをimportする手順を掲載する。

仕様書

環境

  • Windows_NT x64 10.0.22621
  • VSCODE 1.85.2
  • Python 3.11.5

手順書

下記のようなファイルの構成になってるとしてtest.pyからutils.pyをimportするサンプル。

workspace/
    utils.py
    scripts/
        test.py

utils.pyにあるtest_printを呼び出すとして

def test_print(str):
    print(str)

test.pyはこんな感じ。

import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import utils

utils.test_print("test!")

os.path.abspath(__file__))test.pyのフルパスを取得して、os.path.dirnameでファイル名を消して、更にos.path.dirnameで一番下のディレクトリを消して、sys.path.appendimportの起点になるディレクトリとしてtest.pyの親のディレクトリ(この場合はworkspace)のパスを追加してる。

コードを使わずなんとかしたい!

毎回、このコードを挿入するのは面倒なのでコードを使わずなんとかしたい!

環境変数PYTHONPATHimportの起点になるディレクトリを設定しておくとコード側での対応は不要になる。

ワークスペースのルートを登録しておくとワークスペース内のどのファイルからでも共通のパスでimport出来るようになるので楽ちんだ!

VSCODEのtask.jsonbuildを実行時、環境変数PYTHONPATHにワークスペースのルートを登録する例。

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "run",
            "type": "shell",
            "command": "pipenv",
            "options": {
                "env": {
                    "PYTHONPATH": "${workspaceRoot}/;${env:PYTHONPATH}"
                }
            }
            "args": [
                "run",
                "python",
                "${file}",
            ],
            "group": {
                "kind": "build",
                "isDefault": true,
            },
        }
    ]
}

まとめ(感想文)

もうちょっとやり方がありそうなんだけども、私の今の環境ではこんな感じ。