Pylint无法导入错误,但在Pycharm中可以正常工作

6
我的程序基本结构如下:
top_dir
__init__.py
readme.rst
    sub_dir
    __init__.py
        sub_sub_dir
        __init__.py
        example_module.py
        sub_sub_dir2
        __init__.py
        module_with_import.py

在Pycharm中,所有的导入操作都可以正常运行。例如,在'module_with_import.py' 中我使用以下导入语句:
from sub_dir.sub_sub_dir.example_module import function

然而,如果我对module_with_import.py运行pylint,我将得到以下错误:
Unable to import 'sub_dir.sub_sub_dir.example_module' (import-error)

有人看出这里的问题了吗?


1
你的PyCharm项目设置(项目结构)有自定义设置吗?在执行之前,PyCharm会修改PYTHONPATH以将所有源文件夹包含在PYTHONPATH环境变量中。我猜你尝试在Sub-sub-dir2作为当前工作目录下运行类似于pylint module_with_import.py的PyLint。请在Sub-dir目录中尝试pylint Sub-dir/Sub-sub-dir2/module_with_import.py - Łukasz Rogalski
如果我将目录更改为sub_dir并键入pylint sub_dir/sub_sub_dir2/module_with_import.py,我会收到以下错误:no module named sub_dir/sub_sub_dir2/module_with_import.py 如果我在sub_dir中运行'pylint sub_sub_dir2/module_with_import.py',它会工作但结果相同。 - monpy
我仍然得到相同的错误 :(。 同时,我还创建了一个名为.pylintrc的文件,并包含以下内容: [General] init-hook='import sys; sys.path.append("home/username/PycharmProjects/top_dir")' 不幸的是,没有成功。 顺便说一句:在我的项目的旧版本中,虽然包含相同的导入,但我没有遇到这个错误。 非常奇怪,但肯定有解决办法。 - monpy
展示一个实际的Shell会话,而不是一个假设的软件包。 - rbp
3个回答

4

模块(包)名称中不能有负号。将Sub-dir重命名为sub_dirSub-sub-dir重命名为sub_sub_dirSub-sub-dir2重命名为sub_sub_dir2

接下来,请阅读PEP-8 Python风格指南


谢谢您的回复。抱歉,我的实际软件包(模块)名称中没有任何减号。我已经编辑了我的问题。 - monpy
我的文件夹名称中包含了破折号,导致出现了“无法导入路径”错误!将名称中的破折号删除后可以解决导入问题。 - MUG4N

1

top_dir和sub_dir的名称相同吗?如果是这样的话,并且在top_dir中没有需要导入的文件(只有存储在该目录中的模块),请删除__init__.py__init__.pyc文件,然后重试。

想象一下以下情况:

foo
__init__.py
  foo
  __init__.py
     bar
     __init__.py
     baz.py

如果你的导入语句类似于import foo.bar.baz或者from foo.bar import baz,并且你是在顶层目录'foo'中运行脚本,那么导入会失败因为Python导入会将当前目录放在sys.path中。你需要告诉Python顶层不是一个模块,或者将你想要的路径插入到sys.path中。

0
我通过以下方式解决了这个问题:
  1. 进入你的基础项目
  2. 在你的基础项目中创建一个 .pylintrc 文件
  3. 将以下内容添加到 .pylintrc 文件中
[MASTER]
init-hook='import sys; sys.path.append("/path/to/virtualenv_or_pipenv/.../Lib/site-packages/")'

您可以检查Pycharm项目设置/首选项中的Python解释器路径。解释器是Scripts(在Windows系统的情况下),请改用Lib文件夹路径(/path_to/.../Lib/site-packages/)。
希望这可以帮助到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接