270

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

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

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

F0401: Unable to import 'one'

我该如何解决?

4

31 回答 31

213

我知道有两种选择。

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

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

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

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

这两个选项都应该有效。

希望有帮助。

于 2010-06-17T19:46:38.023 回答
100

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

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

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

于 2016-08-29T13:15:26.597 回答
62

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

{
    "python.pythonPath": "venv/bin/python",
    "python.linting.pylintPath": "venv/bin/pylint"
}
于 2018-12-24T02:22:00.240 回答
35

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

当您不在文件夹内运行时(即可能来自 pylint,虽然我没有使用过),基本大纲是:

topdir\
  __init__.py
  functions_etc.py
  subdir\
    __init__.py
    other_functions.py

这就是 python 解释器在不参考当前目录的情况下知道模块的方式,因此如果 pylint 从其自己的绝对路径运行,它将能够访问或,前提functions_etc.py是.topdir.functions_etctopdir.subdir.other_functionstopdirPYTHONPATH

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

于 2009-12-14T07:45:20.260 回答
33

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

创建.pylintrc并添加

[MASTER]
init-hook="from pylint.config import find_pylintrc;
import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
于 2020-01-19T11:04:18.990 回答
30

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])'

或者

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

.. 和

pylint --rcfile /path/to/pylintrc /path/to/module.py
于 2014-04-29T21:06:38.970 回答
16

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

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

它在 PyCharm IDE 中对我有用

于 2021-03-23T16:58:33.553 回答
9

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

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

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

于 2010-11-12T08:12:32.483 回答
4

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

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

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

于 2016-09-11T15:30:25.843 回答
3

尝试

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(不导入absolute_importfrom __future__)和 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 one(也许通过命令行),或者在运行 PyLint 时将以下代码放在某处:

import os

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

基本上,作为摆弄 PYTHONPATH 的替代方法,只需确保当前工作目录是one.py执行导入时包含的目录。

(看看布赖恩的回答,您可能可以将前面的代码分配给init_hook,但如果您要这样做,那么您可以简单地附加到sys.path他所做的事情,这比我的解决方案稍微优雅一些​​。)

于 2010-06-17T20:03:20.887 回答
3

我刚刚发现的一种解决方法是实际上只为整个包而不是单个文件运行 PyLint。不知何故,它设法找到导入的模块。

于 2009-12-16T06:15:10.370 回答
3

我找到了一个不错的答案。编辑您的 pylintrc 并在 master 中添加以下内容

init-hook="import imp, os; from pylint.config import find_pylintrc; imp.load_source('import_hook', os.path.join(os.path.dirname(find_pylintrc()), 'import_hook.py'))"
于 2019-09-17T17:51:43.280 回答
3

我遇到了同样的问题,并通过在我的 virtualenv 中安装 pylint 然后将 .pylintrc 文件添加到我的项目目录中来修复它,文件中包含以下内容:

[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'
于 2016-07-26T17:17:15.990 回答
3

如果你想从当前的模块/文件中走出来pylint寻找模块的根目录,这将做到这一点。

[MASTER]
init-hook=sys.path += [os.path.abspath(os.path.join(os.path.sep, *sys.argv[-1].split(os.sep)[:i])) for i, _ in enumerate(sys.argv[-1].split(os.sep)) if os.path.isdir(os.path.abspath(os.path.join(os.path.sep, *sys.argv[-1].split(os.sep)[:i], '.git')))][::-1]

如果你有一个 python 模块~/code/mymodule/,有一个像这样的顶级目录布局

~/code/mymodule/
├── .pylintrc
├── mymodule/
│   └── src.py
└── tests/
    └── test_src.py

然后这将添加到您的 python 路径并允许 pylint 在您的 IDE中~/code/mymodule/运行,即使您正在导入mymodule.src.tests/test_src.py

您可以将检查换成 a ,.pylintrc但是当涉及到 python 模块的根目录时,通常需要一个 git 目录。

在你问之前

使用的答案import sys, os; sys.path.append(...)缺少可以证明我的答案格式合理的东西。我通常不会那样编写代码,但在这种情况下,您会遇到 pylintrc 配置解析器和评估器的限制。它实际上是在 init_hook 回调的上下文中运行exec的,因此任何尝试 import pathlib、使用多行语句、将某些内容存储到变量中等都将不起作用。

我的代码的一种不那么恶心的形式可能如下所示:

import os
import sys

def look_for_git_dirs(filename):
    has_git_dir = []
    filename_parts = filename.split(os.sep)
    for i, _ in enumerate(filename_parts):
        filename_part = os.path.abspath(os.path.join(os.path.sep, *filename_parts[:i]))
        if os.path.isdir(os.path.join(filename_part, '.git')):
            has_git_dir.append(filename_part)
    return has_git_dir[::-1]

# don't use .append() in case there's < 1 or > 1 matches found
sys.path += look_for_git_dirs(sys.argv[-1])

我希望我可以使用pathlib.Path(filename).parents它会使事情变得更容易。

于 2020-11-12T22:20:27.567 回答
3

安装 Python 时,可以设置路径。如果路径已经定义,那么您可以在 VS Code 中执行操作,按 Ctrl+Shift+P 并键入 Python:选择解释器并选择 Python 的更新版本。点击此链接了解更多信息,https://code.visualstudio.com/docs/python/environments

于 2020-07-18T02:41:55.440 回答
2

我有同样的问题,因为我找不到答案,我希望这可以帮助任何有类似问题的人。

我将flymake与epylint一起使用。基本上我所做的是添加一个 dired-mode-hook 来检查 dired 目录是否是 python 包目录。如果是,我将它添加到 PYTHONPATH。在我的例子中,如果一个目录包含一个名为“setup.py”的文件,我认为它是一个 python 包。

;;;;;;;;;;;;;;;;;
;; PYTHON PATH ;;
;;;;;;;;;;;;;;;;;

(defun python-expand-path ()
  "Append a directory to the PYTHONPATH."
  (interactive
   (let ((string (read-directory-name 
          "Python package directory: " 
          nil 
          'my-history)))
     (setenv "PYTHONPATH" (concat (expand-file-name string)
                  (getenv ":PYTHONPATH"))))))

(defun pythonpath-dired-mode-hook ()
  (let ((setup_py (concat default-directory "setup.py"))
    (directory (expand-file-name default-directory)))
    ;;   (if (file-exists-p setup_py)
    (if (is-python-package-directory directory)
    (let ((pythonpath (concat (getenv "PYTHONPATH") ":" 
                  (expand-file-name directory))))
      (setenv "PYTHONPATH" pythonpath)
      (message (concat "PYTHONPATH=" (getenv "PYTHONPATH")))))))

(defun is-python-package-directory (directory)
  (let ((setup_py (concat directory "setup.py")))
    (file-exists-p setup_py)))

(add-hook 'dired-mode-hook 'pythonpath-dired-mode-hook)

希望这可以帮助。

于 2013-11-09T23:11:44.593 回答
2

sys.path关键是在不考虑 env 变量的情况下添加您的项目目录。

对于使用 VSCode 的人,如果您的项目有一个基本目录,那么这里有一个适合您的单行解决方案:

[MASTER]
init-hook='base_dir="my_spider"; import sys,os,re; _re=re.search(r".+\/" + base_dir, os.getcwd()); project_dir = _re.group() if _re else os.path.join(os.getcwd(), base_dir); sys.path.append(project_dir)'

让我稍微解释一下:

  • re.search(r".+\/" + base_dir, os.getcwd()).group(): 根据编辑文件查找基目录

  • os.path.join(os.getcwd(), base_dir): 添加cwdsys.path满足命令行环境


仅供参考,这是我的 .pylintrc:

https://gist.github.com/chuyik/f0ffc41a6948b6c87c7160151ffe8c2f

于 2016-05-15T13:09:15.863 回答
2

首先,转到您的 VS Code,然后按“ctrl + shift + p”

然后搜索settings.json

然后将下面的代码粘贴到 settings.jason 中。希望问题能得到解决。

{

"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/pylint"

}

于 2020-10-11T13:52:46.660 回答
1

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

sys.path.append(dirname)
于 2009-12-15T12:08:13.347 回答
1

如果您使用的是 Windows:

  • 获取刚刚创建的虚拟环境中python.exe的路径
  • 应该是这样的Z:\YourProjectFolder\Scripts\python.exe
  • 然后转到您的 vscode 并编辑用户settings.json
  • 添加这一行:"python.pythonPath": "Z:\\YourProjectFolder\\Scripts\\python.exe"
  • 保存它,这应该可以解决问题
  • 注意:将其放入 json 文件时使用双反斜杠而不是单反斜杠
{
    "python.pythonPath": "Z:\\YourProjectFolder\\Scripts\\python.exe"
}
于 2021-04-02T15:36:03.813 回答
1

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

from .. import one

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

于 2019-08-23T18:20:45.223 回答
1

您好,我能够从不同的目录导入包。我刚刚做了以下事情:注意:我使用的是 VScode

创建 Python 包的步骤 使用 Python 包非常简单。您需要做的就是:

  • 创建一个目录并给它你的包名。
  • 把你的课放在里面。
  • 在目录中创建一个 __init__.py 文件

例如:您有一个名为 Framework 的文件夹,其中保存了所有自定义类,您的工作就是在名为 Framework 的文件夹中创建一个 __init__.py 文件。

在导入时,您需要以这种方式导入--->

from Framework import base

所以 E0401 错误消失了 Framework 是您刚刚创建 __init__.py 的文件夹,而 base 是您需要导入并使用的自定义模块希望它有帮助!!!!

于 2018-07-09T07:01:00.200 回答
1

Mac 用户:如果您使用带 vsCode 的 Anaconda 3 并且有多个环境,则通过settings.jsonfor vsCode 指向以下路径也可以:

{
  "python.pythonPath": "/Users/username/opt/anaconda3/bin/python",
  "python.linting.pylintPath": "/Users/username/opt/anaconda3/bin/python"
}
于 2021-03-17T16:44:35.590 回答
1

如果有人正在寻找一种在 PyCharm 中将 pylint 作为外部工具运行并让它在他们的虚拟环境中工作的方法(为什么我来这个问题),我是这样解决的:

  1. 在 PyCharm > Preferences > Tools > External Tools 中,为 pylint 添加或编辑项目。
  2. 在 Edit Tool 对话框的 Tool Settings 中,将 Program 设置为使用 python 解释器目录中的 pylint:$PyInterpreterDirectory$/pylint
  3. 在“参数”字段中设置其他参数,例如:--rcfile=$ProjectFileDir$/pylintrc -r n $FileDir$
  4. 将您的工作目录设置为$FileDir$

现在使用 pylint 作为外部工具将在您使用通用配置文件选择的任何目录上运行 pylint,并使用为您的项目配置的任何解释器(可能是您的 virtualenv 解释器)。

于 2016-05-02T16:15:43.997 回答
1

尝试提交 PR 时出现此错误。我最终要做的只是在“导入”发生的同一行添加 #pylint: disable=E0401 。

这有助于我通过自动测试。

于 2021-07-22T17:50:58.887 回答
0

我一直在为此苦苦挣扎,最终发现了这里没有描述的东西。这是我对这个问题的 2 美分:我在 Windows 上使用 VS Code,使用虚拟环境。由于某些原因,pylint 可执行文件称为 epylint 而不是 pylint。在我的脚本或 CLI 提示符下,我正在运行 pylint ./xxx 并且系统正在启动它在其他地方找到但不是合适的 pylint。我刚刚在我的 shell 脚本中添加了一个 e,我的“无法导入”问题最终消失了。

于 2022-01-13T11:12:53.697 回答
0

如果您在 Linux 中使用 Cython,我解决了删除module.cpython-XXm-X-linux-gnu.so项目目标目录中的文件。

于 2019-09-11T12:57:08.957 回答
0

我发现这在.pylintrc具有 pipenv 虚拟环境的本地文件中运行良好:

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

有关站点包的信息,请参阅此帖子

于 2021-06-19T06:02:47.223 回答
0

如果您使用 vscode,请确保您的包目录不在 _pychache__ 目录中。

于 2018-11-21T08:15:38.037 回答
0

只需将此代码添加到.vscode/settings.json文件中

,"python.linting.pylintPath": "venv/bin/pylint"

这将通知 pylint 的位置(这是 python 的错误检查器)

于 2020-06-30T18:50:13.537 回答
0

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

[MASTER]
init-hook='import sys,os;[sys.path.append("your_workspace_path"+di) for di in os.listdir("your_workspace_path")]'
于 2022-02-16T13:06:58.077 回答