python - VSCode 中的绝对导入失败
问题描述
所以我有一个以此为结构的项目:
Folder
folderA
folderB
folderC
folderD
folderD
让我的项目启动“位置”,在该项目中,我将文件夹 A/B/C 添加为我的结构/依赖项。而现在我可以做到了import folderA.someModule
。现在这在 PyCharm 中很棒......但是如果我想迁移到 VS Code,那么该项目将不再有效。因为 PyCharm 在“运行时”创建这些环境......
有人会这么好心,让我知道如何在 VScode 中做到这一点吗?或者我应该添加哪些环境变量sys.path
以使其工作?我迷路了。添加一些路径来sys.path
帮助,但一些导入仍然不起作用。
解决方案
最重要的是,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.py
并main.py
在导入时运行代码 - 没有if __name__ == "__main__":
样板。
Project
├ __main__.py
├ Source
│ └ main.py
└ Module
└ __init__.py
推荐阅读
- javascript - React hooks,卸载组件时,重置 Redux 数据
- git - Azure DevOps - 在另一个 PR 完成后自动创建 PR
- java - Spring 不会使用 @JsonCreator 解析
- css - 如何使2个网格站在同一条线上?
- typescript - Svelte Typescript - 提取道具类型
- node-red - 打开 RowDataPacket 内容(红色节点)
- bash - -bash:yarn:即使在全局安装后也找不到命令
- java - 如何将返回类型更改为映射或对象?
- python - 用于张量的 scipy 和 numpy 中的 SVD
- python - 按两列对数据框进行排序 - 这样两列的顺序就无关紧要了