Python本地模块路径交叉import完美解决方案

Python本地模块路径交叉import完美解决方案

问题分析

  • 个人项目会使用一些杂七杂八脚本组成的本地库,可能的特点
    • 上层、下层、同层脚本均可能发生相互import
    • 可能有主脚本,但主脚本也未必在项目根目录
    • 每个脚本实际各有用途,均需要能够单独运行
  • 遇到的问题
    • vscode中依靠pylance能识别import,但运行时会各种报错:ModuleNotFoundError
    • bat文件执行时也会出现同样问题
    • 尝试在.vscode文件夹中添加设置,但仅能确保vscode中F5运行无问题,右键Run Python in Terminal以及bat脚本仍然不行
    • 尝试代码内添加类似如下内容,实际能解决问题,但脚本过于冗余
      # 路径设置
      ROOT_DISTANCE = 3   # 距离根目录文件夹层级(需手动维护)
      import sys
      from pathlib import Path
      root = str(Path(__file__).parents[ROOT_DISTANCE-1].resolve())
      if root not in sys.path: sys.path.insert(0, root)
    
  • 问题解决
    • 实际问题的关键点是明确项目的根目录位置
    • 【要求】所有python脚本的import全部使用绝对import,即以项目根目录为起始的包路径
    • 以下为各环境下的详细解决方案

VSCode

  • 仅需一次性设置,可解决vscode中的全部问题
  • 在vscode中搜索找到settings.json
  • 一次性添加以下配置即可
    "terminal.integrated.env.windows": {
        "PYTHONPATH": "${workspaceFolder}"
    },
    "terminal.integrated.env.linux": {
        "PYTHONPATH": "${workspaceFolder}"
    },
    "terminal.integrated.env.osx": {
        "PYTHONPATH": "${workspaceFolder}"
    }

bat

  • 使用场景:运行非项目根目录下的python,且此脚本import了项目下的其他脚本
  • 需要在每个符合使用场景的脚本中额外处理,指定临时pythonpath
  • 示例bat,路径为folder1/folder2/test.bat
@echo off

cd ..
cd ..
set "PYTHONPATH=%CD%"
@REM echo PYTHONPATH set to: %PYTHONPATH%
python folder1/folder2/test.py

pause