首页 > 解决方案 > VSCode 中的绝对导入失败

问题描述

所以我有一个以此为结构的项目:

Folder
   folderA
   folderB
   folderC
   folderD

folderD让我的项目启动“位置”,在该项目中,我将文件夹 A/B/C 添加为我的结构/依赖项。而现在我可以做到了import folderA.someModule。现在这在 PyCharm 中很棒......但是如果我想迁移到 VS Code,那么该项目将不再有效。因为 PyCharm 在“运行时”创建这些环境......

有人会这么好心,让我知道如何在 VScode 中做到这一点吗?或者我应该添加哪些环境变量sys.path以使其工作?我迷路了。添加一些路径来sys.path帮助,但一些导入仍然不起作用。

标签: pythonvisual-studio-codepython-import

解决方案


最重要的是,Pycharm 对嵌套文件夹做了奇怪的工作。

假设我们有main.py以下内容:

try:
    import Module

    print("Direct import")
except ImportError:
    from os.path import abspath, dirname
    from sys import path

    path.append(dirname(abspath(__file__)) + "/..")
    import Module
    
    print("Relative import")


from os import getcwd

print(f"Current script dir: {__file__}")
print(f"Module dir: {Module.__file__}")
print(f"Working dir: {getcwd()}")

并且Module.__init__什么都不包含。

对于以下结构:

Project
├ Source
│  └ main.py
└ Module
   └ __init__.py

Executingmain.py直接导入。

Direct import
Current script dir: Z:/github/PersonalToolkit/Source/main.py
Module dir: Z:\github\PersonalToolkit\Module\__init__.py
Working dir: Z:\github\PersonalToolkit\Source

但是,对于以下结构:

Project
└ Root
   ├ Source
   │  └ main.py
   └ Module
      └ __init__.py
Relative import
Current script dir: Z:/github/PersonalToolkit/Root/Source/main.py
Module dir: Z:\github\PersonalToolkit\Root\Source/..\Module\__init__.py
Working dir: Z:\github\PersonalToolkit\Root\Source

然而,对于这两种情况,Pycharm 都显示了相同的导入提示。

在此处输入图像描述

由此我们可以猜测 Pycharm 在运行时添加了Project Rootsys.path并创建了这种不同的行为。

但是,我们不能指望在通常的运行案例(主要是控制台)上的行为会得到一致的结果。

相反,在外部文件夹中导入模块时,只需像这样导入:

from os.path import abspath, dirname
from sys import path

path.append(dirname(abspath(__file__)) + "/..")
import Module

这确实违反了 PEP-8,看起来并不干净。最好有__main__.py外部,让它导入main.pymain.py在导入时运行代码 - 没有if __name__ == "__main__":样板。

Project
├ __main__.py
├ Source
│  └ main.py
└ Module
   └ __init__.py

推荐阅读