Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 适当的相对进口:;无法导入模块";_Python_Python 3.x_Visual Studio Code - Fatal编程技术网

Python 适当的相对进口:;无法导入模块";

Python 适当的相对进口:;无法导入模块";,python,python-3.x,visual-studio-code,Python,Python 3.x,Visual Studio Code,我的项目结构如下: . └── myapp    ├── app.py    ├── models    │   ├── hello.py    │   └── world.py    └── requirements.txt from models.hello import Hello from models.world import World 我有两种型号,hello和world。这两个模型都是从app.py中使用的,在这里我像这样导入它们: . └── myapp   

我的项目结构如下:

.
└── myapp
    ├── app.py
    ├── models
    │   ├── hello.py
    │   └── world.py
    └── requirements.txt
from models.hello import Hello
from models.world import World
我有两种型号,
hello
world
。这两个模型都是从
app.py
中使用的,在这里我像这样导入它们:

.
└── myapp
    ├── app.py
    ├── models
    │   ├── hello.py
    │   └── world.py
    └── requirements.txt
from models.hello import Hello
from models.world import World
但是
world
也需要使用
hello
。我在
world.py中试过这个:

from models.hello import Hello
当我运行应用程序时,上述技术是有效的,但VSCode的Python扩展给了我以下错误:

E0401:Unable to import 'models.hello'.

从同一目录导入子模块的正确方法是什么?如何在VSCode中避免此错误?

由于hello.pyworld.py位于同一文件夹(aka package)中,您应该在world.py中导入hello类,如下所示:

from .hello import Hello
如本线程中所述:


这里的
表示从当前包导入。

您收到的错误是一个名为
pylint
的python linter报告的错误。因此,问题并不是真正特定于vscode扩展

有两种解决方案:

  • 请尝试使用vape
    PYTHONPATH=./myapp
    在项目目录中添加一个
    .env
    文件,这将告诉pylint在哪里可以找到您的模块

  • 或者直接在vscode中打开文件夹
    myapp
    ,而不是在vscode中打开父目录


  • 错误来自pylint。您需要将此行添加到settings.json文件(VS代码):

    “python.linting.pylintArgs”:[“--init hook”,
    “导入sys;sys.path.append(“”)”,
    
    .vscode/settings.json
    (工作区的根目录)中,您需要以下两行:

    一个是在虚拟环境中使用pylint(如果您有),以便pylint知道它。如果您的pylint或虚拟环境位于不同的位置,则需要调整以下参数

    “python.linting.pylintPath”:“${workspaceFolder}/api/venv/bin/pylint”
    
    还有一个,作为Shtefan,让pylint知道项目的python部分在哪里:

    “python.linting.pylintArgs”:[
    “--init hook”,
    “导入sys;sys.path.append('${workspaceFolder}/api')”
    ]
    

    如果您的虚拟环境中尚未设置vscode,则此附加行可能会有所帮助。如果您的虚拟环境路径与下面的路径不匹配,则可能需要再次进行修改

    “python.pythonPath”:“${workspaceFolder}/api/venv/bin/python”,
    
    希望您的所有模块中都有init文件。这可以解决应用程序中的vscode错误
    app.py
    是应用程序的入口点,因此即使在world.py中,我也无法从hello导入,因为hello位于models中,而不是项目根目录中。我没有收到名为“你好”的模块。
    @jimmysanschez你是对的,我已经更新了我的答案。它应该是来自的
    。hello导入hello
    使用来自模型的
    有什么问题。hello导入hello
    ?错误是否有任何解释,或者是vs扩展无法正确理解导入?使用
    .env
    文件解决了vs代码无法按住ctrl键并单击导航到导入的本地类的问题。谢谢我似乎太蠢了,不能这样做。请您更具体地举一个关于venv的例子好吗?我也不知道myapp的定义。Thanks@Christian您可以在项目的根目录下创建一个
    .env
    文件,并将变量
    PYTHONPATH=path\u放入到您的\u包中。在作者示例中,从根目录到is package的路径是
    /myapp
    ,因此他需要将变量
    PYTHONPATH=./myapp
    放入env文件中,每个项目都有一个venv。哪一条路是门?我不使用venv。但根据doco,您可以尝试使用以下参数:sys.prefix和sys.exec_prefix。另一种选择是切换到不同的短绒。最近我开始使用flake8,到目前为止一点问题也没有。我已经搜索了几个小时,这就解决了它!谢谢使用from models.hello导入hello有什么问题?是否有任何错误的解释,或者是vs扩展无法正确理解导入?