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

我怎么解决这个问题?


当前回答

首先,进入VS Code,然后按“ctrl + shift + p”

然后搜索settings.json

然后将下面的代码粘贴到设置中。我希望问题能够解决。

{

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

}

其他回答

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

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

如果您想从交给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

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

你可以用.pylintrc来代替检查,但当涉及到python模块的根目录时,git目录通常是你想要的。

在你问之前

使用import sys, os;Sys.path.append(…)缺少一些东西来证明我的答案的格式。我通常不这样写代码,但在这种情况下,您将受困于处理pylintrc配置解析器和求值器的局限性。它实际上是在init_hook回调的上下文中运行exec,因此任何导入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(文件名)。父母们,这样事情就容易多了。

在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()相同的值。

1)系统。Path是一个列表。

2)有时问题出在系统。Path不是你的virtualenv。路径,你想在你的virtualenv中使用pylint

3)就像上面说的,使用init-hook(注意' and " pylint的解析是严格的)

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

or

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

.. 而且

pylint --rcfile /path/to/pylintrc /path/to/module.py

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

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

;;;;;;;;;;;;;;;;;
;; 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)

希望这能有所帮助。