Vscode中python的Attempted relative import beyond toplevel package

Vscode中python的Attempted relative import beyond toplevel package

  • 1.问题背景
  • 2.我的文件格式
  • 3.问题所在
  • 4. 解决问题

1.问题背景

最近在pycharm中做了一个项目。由于项目比较简单,一直都是用pychram写完后,把文件上传岛服务器端的。最近试了朋友的推荐,采用Vscode远程管理服务器的代码。用Vscode打开后,发现一直出现报错!Attempted relative import beyond toplevel package,但是代码还是可以运行的,由于本人对红色波浪线非常强迫症,探究了一下为什么会报错。

2.我的文件格式

我的文件树结构是这样的:

.
│  bot.py
│  config.py
└─awesome
    └─plugins
        │  add_new_job.py
        │  check.py
        │  check_tip_zhang.py
        │  get_current_task.py
        │  get_name.py
        │  group_admin.py
        │  music.py
        │  my_task.py
        │  plan.py
        │  scheduler.py
        │  tuling.py
        │
        └─weather
                data_source.py
                __init__.py

plugins文件夹为插件,在bot.py中导入使用。为了方便使用,我将get_current_task.pyget_name.py作为模块提出,在plugins文件夹下,很多插件都调用了这个模块。
比如在add_new_job.py中,我的调用方式就是:

from . import get_current_task

就出现了报错Attempted relative import beyond toplevel package

3.问题所在

其实这个问题的原因不难,因为我在调试代码时,在vscode中,python语法默认了add_new_job.py是一个脚本文件。而且是在顶层的脚本文件。在《Python Cookbook》书中有提到,相对导入只适合包中的模块。在顶层脚本的简单模块是不起作用的。Vscode并不是一个IDE软件,作为一个文本编辑软件,默认我的add_new_job.py是执行文件,就报错了。
而在实际过程中,bot.py才是执行文件,add_new_job.py也只是一个模块罢了,所以运行不会报错!

4. 解决问题

那么如何解决这个问题呢?因为我的插件是需要初始化就运行的,不能简单新建文件夹,因此只能借助 __init__.py 文件,将主体需要初始化的代码放在其中,就可以了。最后的树是这样的:

:.
│  bot.py
│  config.py
│
└─awesome
    │  __init__.py
    │
    └─plugins
        │  __init__.py
        │
        ├─add_new_job
        │      __init__.py
        │
        ├─check
        │      __init__.py
        │
        ├─check_tip_zhang
        │      __init__.py
        │
        ├─common_package
        │      get_current_task.py
        │      get_name.py
        │      __init__.py
        │
        ├─group_admin
        │      __init__.py
        │
        ├─music
        │      __init__.py
        │
        ├─my_task
        │      __init__.py
        │
        ├─plan
        │      __init__.py
        │
        ├─scheduler
        │      __init__.py
        │
        ├─tuling
        │      __init__.py
        │
        └─weather
                data_source.py
                __init__.py

这样就不会报错了。我认为也可以直接在plugins__init__.py ,但是从继续扩展开发角度考虑,这样的文件结构有利于重构(胡说八道)。当然,我只是解决一下自己的强迫症,各位不要让自己的执行文件不能运行呀!

你可能感兴趣的:(Python学习,python,windows,visual,studio,code,github)