【问题标题】:Absolute import fails in VSCodeVSCode 中的绝对导入失败
【发布时间】:2020-11-10 13:41:16
【问题描述】:

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

Folder
   folderA
   folderB
   folderC
   folderD

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

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

【问题讨论】:

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


    【解决方案1】:

    除此之外,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
    

    执行main.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 Root 添加到 sys.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
    

    【讨论】:

    • 我明白了,谢谢!因此,这是一个向环境添加路径的情况。我现在再次“重新添加”了路径,并且该应用程序似乎正在运行。我希望 pycharm 会在文件的某处生成“自动环境扩展”代码,以便我可以在我的 main 中将其引用为 import pyCharmEnviFile 以便它也适用于其他 IDE。谢谢你的解释!即使在我的情况下,我也很难使用 1 main.py,因为我有多个项目可以链接到文件夹结构中的类似库。说(客户端、监视器、用户)应用程序链接到“网络”库。
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多