如何解决Python项目中的“未解决的导入”和“无法导入”消息?

时间:2019-12-08 17:59:29

标签: python visual-studio-code module warnings python-import

我使用以下结构的VSCode打开了一个目录(在WSL Ubuntu上):

import os
import queue
import sys
import cv2
import dlib

from multiprocessing import Queue, Process
from PyQt5.Qt import *
from numpy.core.multiarray import ndarray

class CheckDone(QThread):
    done = pyqtSignal(ndarray)                 # ndarray

    def __init__(self, proces_queue):
        super(CheckDone, self).__init__()
        self.process_queue = proces_queue

    def run(self) -> None:
        while True:
            try:
                image = self.process_queue.get(block=False)
                self.done.emit(image)
                return
            except queue.Empty:
                pass


def proc(q):
    path = os.path.dirname(os.path.abspath(__file__))
    image = cv2.imread(os.path.join(path, '..', 'Resources', 'snowIceLakeMountains.jpg'))
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    detector = dlib.get_frontal_face_detector()
    done = detector(gray, 2)
    q.put(image)


class ExampleApp(QMainWindow):
    def __init__(self, q):
        super().__init__()
        self.q = q
        self.test_button = QPushButton(self)
        self.test_button.clicked.connect(self.start)
        self.checker = None

    def handler_function(self, image):
        cv2.imshow('test', image)

    def start(self):
        p = Process(target=proc, args=(self.q, ))
        self.checker = CheckDone(self.q)
        self.checker.done.connect(self.handler_function)
        self.checker.start()
        p.start()


if __name__ == '__main__':
    pq = Queue()
    app = QApplication(sys.argv)
    window = ExampleApp(pq)
    window.show()
    app.exec_()

当导入与调用它的目录相同的目录中的文件时,收到警告消息. ├── .vscode │ ├── launch.json │ └── settings.json ├── src │ └── polls │ ├── aiohttpdemo_polls │ │ ├── db.py │ │ ├── main.py │ │ ├── routes.py │ │ ├── settings.py │ │ └── views.py │ ├── config │ │ └── polls.yaml │ └── init_db.py └── ve_websocket 。例如:对于unresolved import ...

routes.py

我得到from views import index def setup_routes(app): app.router.add_get("/", index) 。因此,用于unresolved import 'views' Python(unresolved-import)功能的 IntelliSense 不起作用。

但是IntelliSense建议使用这种表示法:

index

现在from polls.aiohttpdemo_polls.views import index 函数已被IntelliSense识别,并且没有警告消息出现,但是在保存文件时,我现在收到此错误消息index

所以我无法运行此脚本:

Unable to import 'polls.aiohttpdemo_polls.views' pylint(import-error)

我的[polls]$ python init_db.py 文件具有以下配置:

settings.json

1 个答案:

答案 0 :(得分:1)

解决方案1: settings.json

该解决方案是关于使用absolute imports(由IntelliSense建议),并且有必要使用PYTHONPATH环境变量,因此我们需要将这些行添加到settings.json文件中作为工作区。

"terminal.integrated.env.linux": {
    "PYTHONPATH": "${workspaceFolder}/src",
},

此后,我们从VSC打开终端,需要确认更改,然后重新打开终端,我们可以运行脚本而不会出现错误,但是VSC IDE仍然在from关键字上显示错误标记,忽略它们,因为IntelliSense可以识别所有导入的对象及其所有属性,因此您可以毫无问题地运行脚本。

解决方案2: sys.path

以前的解决方案的问题在于它仅在使用VSC的终端时才有效。因此,您可以在每个需要导入对象的脚本中使用sys.path。例如,对于我的init_db.py文件:

import sys
from pathlib import Path
sys.path.append(str(Path.cwd().parent))

from sqlalchemy import create_engine, MetaData

from polls.aiohttpdemo_polls.settings import config
from polls.aiohttpdemo_polls.db import question, choice
...