如何从模块外运行时读取与__main__.py同目录下的文件
目录结构
foo ├── bar │ ├── __main__.py │ └── some_file.txt
问题原因
相对路径默认锚定执行命令时的当前工作目录,而非脚本文件本身的存放目录:
- 你在
bar/目录执行命令时,工作目录就是bar/,能正确找到同目录下的some_file.txt - 你在
foo/目录执行命令时,工作目录是foo/,代码会尝试读取不存在的foo/some_file.txt,因此触发报错
修复方案
永久方案(修改代码,不受工作目录影响)
修改__main__.py,先获取脚本自身的存放目录,再拼接目标文件路径即可。
方案1:Python 3.4+ 推荐使用pathlib
from pathlib import Path # 获取当前脚本所在的目录 script_dir = Path(__file__).parent # 拼接得到目标文件的绝对路径 target_file = script_dir / "some_file.txt" with open(target_file, 'r') as f: print(f.read())
方案2:兼容Python 2/3 旧版本
import os # 获取当前脚本所在的目录 script_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接得到目标文件的绝对路径 target_file = os.path.join(script_dir, "some_file.txt") with open(target_file, 'r') as f: print(f.read())
临时方案(无需修改代码)
执行命令时直接切换到bar目录再运行脚本即可:
cd bar && python __main__.py
内容的提问来源于stack exchange,提问作者RedRum0503
相关产品推荐
相关产品推荐

