如何从项目根目录运行含lib相对导入的scripts子目录Python脚本?
解决Python脚本相对导入与运行上下文的问题
关于__init__.py修改工作目录的可行性
不行。__init__.py是Python包的初始化文件,只有当目录被当作模块导入时才会执行。而直接运行python scripts/xxx.py时,脚本是以主程序身份启动,不会触发scripts目录下__init__.py的执行。就算强行在某个__init__.py里改工作目录,也不符合Python模块规范,还可能引发其他路径问题,不建议这么做。
从根目录便捷运行脚本的方法
1. 使用python -m模块运行(推荐)
这是Python官方推荐的模块式运行方式,能自动把项目根目录加入模块搜索路径:
- 先在
scripts目录下创建一个空的__init__.py文件(让Python识别该目录为包); - 从项目根目录执行命令:
python -m scripts.脚本名(注意不带.py后缀)。
比如scripts下有data_process.py,根目录执行:
python -m scripts.data_process
此时Python会将根目录加入sys.path,脚本里的from lib import...就能正常找到lib模块。
2. 设置PYTHONPATH环境变量
通过临时设置环境变量,让Python优先从项目根目录查找模块:
- Linux/macOS终端(根目录下):
export PYTHONPATH=$(pwd) && python scripts/脚本名.py
- Windows命令提示符(根目录下):
set PYTHONPATH=%cd% && python scripts\脚本名.py
- Windows PowerShell(根目录下):
$env:PYTHONPATH = (Get-Location).Path; python scripts\脚本名.py
如果不想每次手动输入,可以把PYTHONPATH的设置加入shell配置文件(比如/.bashrc、/.zshrc),永久生效。
3. 根目录启动脚本封装
在项目根目录写一个统一的启动脚本(比如run.py),用来调用scripts里的脚本,示例:
import sys from scripts import data_process if __name__ == "__main__": # 假设data_process.py里有main函数作为执行入口 data_process.main()
这种方式需要scripts里的脚本把执行逻辑放在if __name__ == "__main__":块或者封装成函数,避免导入时直接执行代码。之后只需在根目录运行python run.py即可。
内容的提问来源于stack exchange,提问作者Alex Poloz
相关产品推荐
相关产品推荐

