pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

OutLine

Pycharm 中完成编码,且在 Pycharm 中可正常运行,以为就万事大吉了,但在Linux命令行中执行时,报错:找不到所导入的包;

先看下目录结构:

  • from scripts import 我在 scripts/init.py* 中写了一个基类,供后续继承使用
  • dump_factor.py 执行的py文件
  • dump_factor.py 中也 sys.path.append 添加了环境变量(把项目根目录添加到环境变量)

pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

网上各种类似问题,也都可以通过 sys.path.append添加环境变量解决,理论上我这个也可以这么解决;

但添加环境变量后,依然报错,提示找不到包;

因此进行debug定位下问题,并且记录下;

报错示例:

pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

Python导入模块的搜索顺序(原理)

python 解释器查找包(模块)的顺序:

  1. 内存(模块缓存)
  2. 内置模块 built-in module(例如:sys、os, 可通过sys.builtin_module_names查看)
  3. sys.path (环境变量中)
    sys.path 列表中 index:0 (第一个元素),为被执行python文件所在目录,优先级最高
  4. 标准库 (可通过sys.modules查看)
  5. .pth 文件(python会寻找.pth文件,然后将文件里路径加入 sys.path)
  6. 第三方库(你pip install的库)

内置模块:

pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

sys.path:

pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

标准库:

pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

问题分析

查看当前 sys.path 环境变量中是否有所需路径

pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

上图是我 sys.path.append() 后的环境变量列表;

可以看到:

/home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor (被执行py文件所在目录)

/home/mdlib/git_pro/mj-data-sdk (项目根目录)

但实际执行时,依然提示找不到模块。

问题解决

因为 sys.path 列表中 index:0 位置,是被执行python文件所在目录,优先级最高,会第一个找这个目录;

而我append进去的项目根目录 < /home/mdlib/git_pro/mj-data-sdk>,在最后面

没等找到它,就先遇到了 /home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor (被执行py文件所在目录),就直接用了

pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

从目录结构来看, /home/mdlib/git_pro/mj-data-sdk/scripts/dump_factor 下面是没有 scripts 的,自然没法导入scripts,就会找不到报错;

但在项目根目录视角下,就有scripts了,就可以导入了;

所以,就当前情况而言,sys.path 中 index:0 位置的路径,应该是项目根目录:

这么操作即可

import sys
import os
curPath = os.path.abspath(os.path.dirname(__file__))
rootPath = os.path.split(curPath)[0]
sys.path.insert(0, os.path.split(rootPath)[0])

把项目根目录 insert 到 sys.path 列表第一个元素,python找的时候就会先找到 项目根目录。

总结

当你在pycharm中完成编码,执行代码时,pycharm会动态帮你把一切都做好,基本不会出现类似导包出错问题;

但在命令行情况下,就需要注意是否存在该问题了;

Original: https://www.cnblogs.com/bigtreei/p/15402092.html
Author: ZhuGaochao
Title: pycharm下可以运行python项目,Linux命令行下报错无法导包,且sys.path.appen()添加环境变量无效

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/15713/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

发表回复

登录后才能评论
免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部