我在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'

我怎么解决这个问题?


当前回答

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。路径,这比我的解决方案略优雅。)

其他回答

我不知道它是如何与WingIDE一起工作的,但是为了与Geany一起使用PyLint,我将我的外部命令设置为:

PYTHONPATH=${PYTHONPATH}:$(dirname %d) pylint --output-format=parseable --reports=n "%f"

其中%f是文件名,%d是路径。可能对某些人有用:)

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

from .. import one

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

如果你使用的是Windows:

获取刚刚创建的虚拟环境中python.exe的路径 它应该像这样Z:\YourProjectFolder\Scripts\python.exe 然后转到vscode,编辑user settings.json 添加这一行:"python。pythonPath环境”:“Z: \ \ YourProjectFolder \ \ \ \ python.exe脚本” 保存它,这应该可以解决问题 注意:在json文件中使用双反斜杠而不是单反斜杠

{
    "python.pythonPath": "Z:\\YourProjectFolder\\Scripts\\python.exe"
}

也许通过手动在PYTHONPATH中追加目录?

sys.path.append(dirname)

我也有同样的问题,并通过在我的virtualenv中安装pylint来修复它,然后在文件中添加一个.pylintrc文件到我的项目目录:

[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'