PyLint"无法导入"错误 - 如何设置PYTHONPATH?

EMP*_*EMP 133 python pylint virtualenv pythonpath

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

__init__.py
myapp.py
one.py
subdir\
    __init__.py
    two.py
Run Code Online (Sandbox Code Playgroud)

two.py我内部import one,这在运行时工作正常,因为顶级目录(从中myapp.py运行)位于Python路径中.但是,当我在two.py上运行PyLint时,它给出了一个错误:

F0401: Unable to import 'one'
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

Bri*_*unt 127

我知道有两种选择.

一,更改PYTHONPATH环境变量以包括模块上方的目录.

或者,编辑~/.pylintrc以包含模块上方的目录,如下所示:

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

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

这两种选择都应该有效.

希望有所帮助.

  • 这个pylint钩子目前是VScode中最好的方式,因为它内置的linter使用还不支持PYTHONPATH. (6认同)
  • 我在使用 MacVim 和 Syntastic 时遇到了同样的问题。如何配置 prosector 以修复导入错误? (2认同)
  • [相关博客文章](http://wgundamj44.github.io/post/2015-10-23-pylint-import-error-in-django/)还有一些更多细节。 (2认同)

x-m*_*gix 30

我在这个页面上找到的这个问题的一般答案请不要打开,网站被 BUGED

创建.pylintrc和添加

[MASTER]
init-hook="from pylint.config import find_pylintrc;
import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
Run Code Online (Sandbox Code Playgroud)

  • 这个链接名称让我困惑 (17认同)
  • 我想补充一点,这个文件应该放在您想要添加到 PYTHONPATH 的目录中。另外,只有当双引号命令位于一行而不是两行(如上所述)时,这才对我有用。 (2认同)

小智 25

改变路径的解决方案init-hook是好的,但我不喜欢我必须在那里添加绝对路径的事实,因此我不能在项目的开发人员之间共享这个pylintrc文件.这个使用pylintrc文件的相对路径的解决方案对我来说效果更好:

[MASTER]
init-hook="from pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
Run Code Online (Sandbox Code Playgroud)

请注意,它pylint.config.PYLINTRC也存在且具有相同的值find_pylintrc().

  • 如果您使用 pyproject.toml 文件,这将不起作用,请改用:`from pylint.config import find_default_config_files; 导入操作系统、系统;sys.path.append(os.path.dirname(下一个(find_default_config_files())))` (7认同)
  • 确认这确实提供了 E0611 和 E0401 pylint 错误的解决方案。对于 VSCode 用户:重要的是打开的文件夹是“python 根文件夹”,并且 .pylintrc 位于该文件夹中。 (3认同)
  • 如果您想添加一个特定的子文件夹(即“ app”),则可以使用from pylint.config import find_pylintrc; 导入os,sys; sys.path.append(os.path.join(os.path.dirname(find_pylintrc()),'app'))` (2认同)

mac*_*acm 24

1)sys.path是一个列表.

2)问题是有时sys.path不是你的virtualenv.path你想在你的virtualenv中使用pylint

3)如上所述,使用init-hook(注意'和'pylint的解析是严格的)

[Master]
init-hook='sys.path = ["/path/myapps/bin/", "/path/to/myapps/lib/python3.3/site-packages/", ... many paths here])'
Run Code Online (Sandbox Code Playgroud)

要么

[Master]
init-hook='sys.path = list(); sys.path.append("/path/to/foo")'
Run Code Online (Sandbox Code Playgroud)

..和

pylint --rcfile /path/to/pylintrc /path/to/module.py
Run Code Online (Sandbox Code Playgroud)

  • 根据这个建议,我似乎通过在我的virtualenv中安装`pylint`来解决这个问题:http://plaidzooks.tumblr.com/post/36813101879 (7认同)

unm*_*ted 19

__init__.py在两个目录中都有一个空文件让python知道dirs是模块吗?

当你没有从文件夹中运行时的基本轮廓(即可能来自pylint的,虽然我没有使用它)是:

topdir\
  __init__.py
  functions_etc.py
  subdir\
    __init__.py
    other_functions.py
Run Code Online (Sandbox Code Playgroud)

这是Python解释器是如何知道模块的不参考当前目录,因此如果pylint的是从自身的绝对路径运行将能够访问functions_etc.pytopdir.functions_etc或者topdir.subdir.other_functions,只要topdir是对的PYTHONPATH.

更新:如果问题不是__init__.py文件,可能只是尝试复制或移动模块c:\Python26\Lib\site-packages- 这是放置其他软件包的常见位置,并且肯定会在您的python路径上.如果你知道如何做Windows符号链接或等效的(我没有!),你可以这样做.这里有更多选项:http://docs.python.org/install/index.html,包括将sys.path附加到开发代码的用户级目录的选项,但实际上我通常只是象征性地链接我的本地开发目录到网站包 - 复制它具有相同的效果.

  • 是的,我在两个目录中都有 `__init__.py`。我认为问题是当 PyLint 运行时,顶级目录不在 PYTHONPATH 中,我不知道如何解决这个问题。 (2认同)
  • 符号链接不是一个好主意。这只能解决您机器上的问题 - 当其他人检查该项目时,他们的项目就会被破坏。 (2认同)

小智 14

可以通过在venv下配置pylint路径来解决此问题:$ cat .vscode / settings.json

{
    "python.pythonPath": "venv/bin/python",
    "python.linting.pylintPath": "venv/bin/pylint"
}
Run Code Online (Sandbox Code Playgroud)

  • 对于 Windows,它是 `{ "python.pythonPath": "${workspaceFolder}\\.venv\\Scripts\\python.exe" "python.linting.pylintPath": "${workspaceFolder}\\.venv\\Scripts\ \pylint.exe" } ` 只是为了完整性。 (5认同)
  • 就那么简单。这听起来比改变导入路径要好得多。这对于任何使用 [poetry](https://python-poetry.org/) 的人来说都是完美的(默认情况下在 `.venv/` 中创建虚拟环境): `"python.linting.pylintPath": "${workspaceFolder }/.venv/bin/pylint",` (3认同)
  • 添加 `"python.linting.pylintPath": "venv/bin/pylint" ` 对我来说就足够了,尽管我已经设置了 pythonPath (3认同)
  • 这看起来与OP无关。它没有提及 vscode 特定的实现。 (3认同)
  • VSCode 现在显示此消息:“settings.json 中定义的设置“python.pythonPath”现已弃用。”如果我删除“python.pythonPath”行,它似乎仍然可以工作。 (2认同)

muT*_*hie 12

pylintrc在项目的根目录中添加了一个新文件

[MASTER]
init-hook='import sys; sys.path.append(".")'
Run Code Online (Sandbox Code Playgroud)

它在 PyCharm IDE 中对我有用

  • 这是在我的计算机上有效的唯一答案。我尝试了上面的其他答案,但不起作用。 (2认同)

sim*_*mon 5

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

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

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


Bri*_*kau 5

我必须更新系统PYTHONPATH变量才能添加我的 App Engine 路径。就我而言,我只需编辑我的~/.bashrc文件并添加以下行:

export PYTHONPATH=$PYTHONPATH:/path/to/google_appengine_folder

事实上,我尝试设置第init-hook一个,但这并没有在我的代码库中一致地解决问题(不知道为什么)。一旦我将它添加到系统路径(通常可能是个好主意),我的问题就消失了。