首页 > 解决方案 > 在 VSCode 中构建 python 应用程序时出现 ImportError

问题描述

我是一个 python 新手,正在尝试在 VSCode 中构建一个 Github python 应用程序,链接在这里: https ://github.com/mapsme/osm_conflate

开发人员的反应不是很灵敏,而且问题也不是特定于程序,所以我在这里问。我在文件夹中创建了launch.json文件/home/janko/source/osm_conflate/.vscode/,内容在这里:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Current File",
            "type": "python",
            "request": "launch",
            "program": "${workspaceRoot}/conflate/conflate.py",
            "console": "integratedTerminal",
            "cwd": "${workspaceFolder}/conflate/",
            "args": [
                "-p", "/home/janko/Documents/profile.py",
                "-o", "josm.osm"
            ]
        }
    ]
}

我得到一个错误:

Exception has occurred: ImportError
attempted relative import with no known parent package
  File "/home/janko/source/osm_conflate/conflate/conflate.py", line 8, in <module>
    from .geocoder import Geocoder

我试图将 python 版本从 3 更改为 python2,但错误的文本只是改变了一点。我试图将其他文件夹放在"cwd"属性中,但它总是一样的。我试图将其他 .py 文件放在"program"json 的一部分中,但这没有帮助。我究竟做错了什么?

标签: pythonvisual-studio-code

解决方案


PEP 328 -- Imports: Multi-Line and Absolute/Relative,我们可以知道

相对导入使用模块的名称属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它被设置为main),那么无论模块实际位于文件系统上的什么位置,相对导入都会像模块是顶级模块一样被解析。

为了解决遇到的错误,我们可以使用绝对导入而不是相对导入。

  1. 将文件夹 conflate 更改为其他名称,否则from conflate.geocoder import Geocoder在 conflate.py 中使用时,会抛出 cirle import 错误。

  2. 复制内容,__init__.py然后删除。将内容粘贴到新创建的__init__.py,然后重新加载窗口;

  3. 用于pip install lxml将需要的模块安装到当前环境中;

  4. 在 conflate.py 中,添加sys.path.append('./')和导入函数,如from conflate.geocoder import Geocoder.

最后就可以成功运行 conflate.py 了:

在此处输入图像描述


推荐阅读