我在Windows上的Wing IDE内部运行PyLint。我有一个子目录(包)在我的项目和包内,我从顶层导入一个模块,即。

__init__.py
myapp.py
one.py
subdir\
    __init__.py
    two.py

在two.py中,我导入了一个,这在运行时工作得很好,因为顶层目录(myapp.py从其中运行)在Python路径中。然而,当我在two.py上运行PyLint时,它会给我一个错误:

F0401: Unable to import 'one'

我怎么解决这个问题?


当前回答

把另一个可能的答案扔到堆里。我尝试了这里提供的许多解决方案。要么是我做错了,要么是我的pylint导入错误是由其他原因引起的。不管怎样,我的解决方法非常简单。

解决方案:重新安装包含您无法导入的所有模块的包(PyPi包而不是pip包),然后重新安装pylint,以便pylint和这些模块由相同的pip安装。

对我来说,拥有正确的目录并不管用。我从另一个关于他的问题的帖子中得到了这个想法。

其他回答

Mac用户:如果你正在使用Anaconda 3 w/ vsCode,并且有多个环境,通过设置指向以下路径。json for vsCode也可以:

{
  "python.pythonPath": "/Users/username/opt/anaconda3/bin/python",
  "python.linting.pylintPath": "/Users/username/opt/anaconda3/bin/python"
}

我知道有两个选择。

第一,更改PYTHONPATH环境变量以包括模块上面的目录。

或者,编辑~/。Pylintrc来包含你的模块上面的目录,像这样:

[MASTER]
init-hook='import sys; sys.path.append("/path/to/root")'

(或者在其他版本的pylint中,init-hook要求你将[General]更改为[MASTER])

这两种选择都应该有效。

这是一个老问题,但没有公认的答案,所以我建议这样做:将import语句更改为two.py:

from .. import one

在我当前的环境中(Python 3.6, VSCode使用pylint 2.3.1),这将清除标记语句。

Try

if __name__ == '__main__':
    from [whatever the name of your package is] import one
else:
    import one

注意,在Python 3中,else子句中部分的语法为

from .. import one

转念一想,这可能并不能解决你的具体问题。我误解了这个问题,以为two.py是作为主模块运行的,但事实并非如此。并且考虑到Python 2.6(没有从__future__导入absolute_import)和Python 3方式的差异。x句柄导入,你不需要在Python 2.6中这样做,我不认为。

不过,如果你最终切换到Python 3,并计划将一个模块既用作包模块,又用作包中的独立脚本,那么保留它可能是一个好主意 类似的

if __name__ == '__main__':
    from [whatever the name of your package is] import one   # assuming the package is in the current working directory or a subdirectory of PYTHONPATH
else:
    from .. import one

在心里的。

编辑:现在是解决你实际问题的可能方案。要么从包含你的一个模块的目录中运行PyLint(可能是通过命令行),要么在运行PyLint时将以下代码放在某个地方:

import os

olddir = os.getcwd()
os.chdir([path_of_directory_containing_module_one])
import one
os.chdir(olddir)

基本上,作为处理PYTHONPATH的另一种方法,只需确保在执行导入时当前工作目录是包含one.py的目录。

(看看Brian的回答,你可能会把前面的代码分配给init_hook,但如果你要这样做,那么你可以简单地追加到sys. hook。路径,这比我的解决方案略优雅。)

我发现这在我的本地.pylintrc文件和pipenv虚拟环境中工作得很好:

[MASTER]
init-hook='import site; sys.path += site.getsitepackages()'

有关站点包的信息请参阅这篇文章。