了解 Python 如何在使用 VS-Code 时从子目录导入模块

问题描述

考虑具有以下内容的以下目录结构:

my-project
├── main.py
├── lib
│   ├── __init__.py
│   ├── foo.py
│   └── bar.py

main.py

import sys
sys.path.append("./lib")

from foo import hello_world

if __name__ == "__main__":
    hello_world()

foo.py

from lib.bar import name

def hello_world():
    print(f"Hello {name}")

if __name__ == "__main__":
    hello_world()

bar.py

name = "Grogu"

当我运行 main.py 时,我没有遇到任何错误并且得到了我期望的结果:Hello Grogu。但是,当我运行 lib/foo.py 时,出现错误

Traceback (most recent call last):
  File "my-project/lib/foo.py",line 1,in <module>
    from lib.bar import name
ModuleNotFoundError: No module named 'lib'

如果我将 lib.bar 更改为 bar,它会按预期工作,但我不明白为什么 VSCode 似乎不知道 lib 文件夹是什么。

我正在使用 VSCode,但我认为我做错了什么。我使用 pyCharm 的朋友能够很好地运行 lib/foo.py。这可能是 VSCode 和 Pycharm 解释源代码的方式。有人有什么建议吗?

基本上,我试图从子目录导入函数并保留在子目录中运行单个文件的能力,但我似乎无法在 VScode 中找到执行此操作的正确方法

解决方法

当您执行 Python 脚本时,脚本所在的特定目录会添加到路径中,但不会添加到其父目录中。

因此,当您从 lib 内部运行 import Enzyme from 'enzyme'; import Adapter from 'enzyme-adapter-react-16'; import mockRNCNetInfo from '@react-native-community/netinfo/jest/netinfo-mock.js'; jest.mock('@react-native-community/netinfo',() => mockRNCNetInfo); Enzyme.configure({ adapter: new Adapter() }); 时,路径将包含 python foo.py 但不包含 .../my-project/lib,因此 Python 找不到模块 .../my-project。但是,它适用于 lib,因为该文件确实存在于 bar 中。

为了能够从根目录和 lib 运行,您可以将父目录(即根目录)插入/附加到 lib .../my-project/lib 中的路径:

__init__.py

然后,更改 main.py:

import sys
from pathlib import Path

sys.path.insert(0,str(Path(__file__).parent))

还有 foo.py:

from lib.foo import hello_world

if __name__ == "__main__":
    hello_world()
,

直接导入bar

enter image description here

foo 和 bar 都是同级的模块,不需要返回 lib,然后返回到搜索栏。我们可以直接运行from bar import name

更多详细信息请参考Python Docs - The import System

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...