pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效
1|0OutLine
Pycharm 中完成编码,且在 Pycharm 中可正常运行,以为就万事大吉了,但在Linux命令行中执行时,报错:找不到所导入的包;
先看下目录结构:
- from scripts import * 我在 scripts/__init__.py 中写了一个基类,供后续继承使用
- dump_factor.py 执行的py文件
- 在 dump_factor.py 中也 sys.path.append 添加了环境变量(把项目根目录添加到环境变量)
网上各种类似问题,也都可以通过 sys.path.append 添加环境变量解决,理论上我这个也可以这么解决;
但添加环境变量后,依然报错,提示找不到包;
因此进行debug定位下问题,并且记录下;
报错示例:
2|0Python导入模块的搜索顺序(原理)
python 解释器查找包(模块)的顺序:
- 内存(模块缓存)
- 内置模块 built-in module(例如:sys、os, 可通过sys.builtin_module_names查看)
- sys.path (环境变量中)
sys.path 列表中 index:0 (第一个元素),为被执行python文件所在目录,优先级最高 - 标准库 (可通过sys.modules查看)
- .pth 文件(python会寻找.pth文件,然后将文件里路径加入 sys.path)
- 第三方库(你pip install的库)
内置模块:
sys.path:
标准库:
3|0问题分析
3|1查看当前 sys.path 环境变量中是否有所需路径
上图是我 sys.path.append() 后的环境变量列表;
可以看到:
/home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor (被执行py文件所在目录)
/home/mdlib/git_pro/mj-data-sdk (项目根目录)
<项目根目录、被执行py文件所在目录> 都有了,按理说python会去遍历 sys.path 列表,肯定能找到对应环境变量(因为我已经append进去了);
但实际执行时,依然提示找不到模块。
4|0问题解决
因为 sys.path 列表中 index:0 位置,是被执行python文件所在目录,优先级最高,会第一个找这个目录;
而我append进去的项目根目录 </home/mdlib/git_pro/mj-data-sdk>,在最后面
没等找到它,就先遇到了 /home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor (被执行py文件所在目录),就直接用了
从目录结构来看,/home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor 下面是没有 scripts 的,自然没法导入scripts,就会找不到报错;
但在项目根目录视角下,就有scripts了,就可以导入了;
所以,就当前情况而言,sys.path 中 index:0 位置的路径,应该是项目根目录:
这么操作即可
把项目根目录 insert 到 sys.path 列表第一个元素,python找的时候就会先找到 项目根目录。
5|0总结
当你在pycharm中完成编码,执行代码时,pycharm会动态帮你把一切都做好,基本不会出现类似导包出错问题;
但在命令行情况下,就需要注意是否存在该问题了;
__EOF__

本文链接:https://www.cnblogs.com/bigtreei/p/15402092.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架