• 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 添加了环境变量(把项目根目录添加到环境变量) 

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

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

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

    报错示例:

    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的库)

    内置模块:

    sys.path:

     

    标准库:

    问题分析

    查看当前 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进去了);

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

    问题解决

    因为 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 位置的路径,应该是项目根目录:

    这么操作即可

    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会动态帮你把一切都做好,基本不会出现类似导包出错问题;

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

  • 相关阅读:
    Java(13)_多线程
    数据去敏
    过滤器(Filter)与拦截器
    Process Automation Accredited Professional Exam Guide Victor
    postgresql 批量删除模式中一些表
    SpringBoot Thymeleaf 模板引擎使用
    使用Qss设置QPushButton图标和显示文本的位置
    【Qt】贴图实现方向控制盘
    【Qt】多级折叠下拉导航菜单
    【Qt】使用QMovie加载Gif动画
  • 原文地址:https://www.cnblogs.com/bigtreei/p/15402092.html
Copyright © 2020-2023  润新知