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

我怎么解决这个问题?


当前回答

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

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

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

其他回答

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

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

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

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

在导入时,你需要以这种方式导入——>

from Framework import base

因此E0401错误消失 Framework是你刚刚创建__init__.py和 Base是您需要导入并处理的自定义模块 希望能有所帮助!!!!

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

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

我使用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)

希望这能有所帮助。

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

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

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

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