如何通过编程方式向PYTHONPATH添加文件夹且仅对当前脚本生效
错误原因
- 你通过
os.system、subprocess调用set命令的方式本身无效:这类调用会创建独立的子shell进程,子进程内部对环境变量的修改仅在子进程运行期间生效,执行完成后子进程销毁,完全不会影响当前运行Python脚本的父进程环境变量,所以你打印os.environ看不到变化。 - 第二个
subprocess.run的报错是因为set是Windows cmd的内置命令,不是独立的可执行文件,subprocess默认查找独立程序时会找不到,即使你加shell=True参数修复了报错,也解决不了子进程修改不影响父进程的核心问题。
正确实现方式
两种方案都可以实现仅当前脚本生效、不修改全局环境变量的需求:
方案1:直接修改当前进程的os.environ
这个修改仅在当前Python进程生命周期内有效,进程结束后自动失效:
import os from pathlib import Path print('BEFORE:', os.environ.get('PYTHONPATH', '')) folder = Path(__file__).resolve().parent.joinpath('code') print('FOLDER:', folder) # os.pathsep会自动适配系统路径分隔符:Windows为分号;,类Unix系统为冒号: os.environ['PYTHONPATH'] = f"{folder}{os.pathsep}{os.environ.get('PYTHONPATH', '')}" print('AFTER:', os.environ['PYTHONPATH'])
方案2:直接修改sys.path(更推荐)
Python导入模块时实际检索的路径就是sys.path列表,环境变量PYTHONPATH的内容只会在解释器启动时自动添加到sys.path里,直接修改sys.path更直接高效:
import sys from pathlib import Path folder = Path(__file__).resolve().parent.joinpath('code') # insert到索引0的位置,会优先从该目录下查找模块 sys.path.insert(0, str(folder)) # 后续即可正常导入code目录下的自定义模块
内容的提问来源于stack exchange,提问作者Tonechas
相关产品推荐
相关产品推荐

