PyLint“无法导入”错误 – 如何设置PYTHONPATH?

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

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

two.py里面我已经import one并且在运行时工作正常,因为顶层目录(从中运行myapp.py )位于Pythonpath中。 但是,当我运行PyLint two.py它给我一个错误:

 F0401: Unable to import 'one' 

我该如何解决?

有两个选项我知道。

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

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

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

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

这两个选项都应该有效。

希望有所帮助。

你有两个目录中的空__init__.py文件,让Python知道目录是模块?

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

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

这就是python解释器如何知道模块而不参考当前目录,所以如果pylint从它自己的绝对path运行,它将能够以topdir.functions_etctopdir.subdir.other_functions访问functions_etc.pytopdirPYTHONPATH

更新:如果问题不是__init__.py文件,也许只是尝试复制或移动你的模块到c:\Python26\Lib\site-packages – 这是一个普通的地方,把额外的软件包,一定会在你的PYTHONPATH。 如果你知道如何做Windows符号链接或者等价的(我不知道!),你可以这样做。 这里有更多选项:http://docs.python.org/install/index.html ,包括将sys.path附加到开发代码的用户级目录的选项,但实际上我通常只是象征性地链接我的本地开发目录到网站包 – 复制它具有相同的效果。

1)sys.path是一个列表。

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

3)所以就像说的那样,使用init-hook(注意在“和”pylint的parsing是严格的)

 [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 

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

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

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

init-hook改变path的解决scheme是好的,但我不喜欢这样的事实,我必须在那里添加绝对path,因为我不能在项目的开发人员之间共享这个pylintrc文件。 这个解决scheme使用相对pathpylintrc文件对我更好:

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

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

我不得不更新系统PYTHONPATHvariables来添加我的App Enginepath。 在我的情况下,我只需要编辑我的~/.bashrc文件,并添加以下行:

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

事实上,我试着设置init-hook但是这并没有解决问题一贯跨我的代码库(不知道为什么)。 一旦我将其添加到系统path(一般来说可能是一个好主意),我的问题就消失了。

也许通过手动添加PYTHONPATH中的目录?

 sys.path.append(dirname) 

尝试

 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执行此操作,我不这么认为。

尽pipe如此,如果您最终切换到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 

心里。

编辑:现在为您的实际问题的可能的解决scheme。 从包含你的one模块的目录(也许通过命令行)运行PyLint,或者在运行PyLint的时候把下面的代码放在某个地方:

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

基本上,作为replacePYTHONPATH的替代方法,只要确保当前工作目录是包含one.py的目录就可以了。

(看Brian的答案,你可能可以将前面的代码分配给init_hook ,但是如果你打算这样做,那么你可以简单地将它附加到sys.path中,这比我的解决scheme稍微优雅一点。)

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

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

希望这可以帮助。

如果有人正在寻找一种方法来在PyCharm中运行pylint作为外部工具,并使其与虚拟环境一起工作(为什么我来到这个问题),下面是我如何解决它:

  1. 在PyCharm>首选项>工具>外部工具中,为pylint添加或编辑一个项目。
  2. 在“编辑工具”对话框的“工具设置”中,将程序设置为使用python解释器目录中的$PyInterpreterDirectory$/pylint$PyInterpreterDirectory$/pylint
  3. 在参数字段中设置其他参数,如:– --rcfile=$ProjectFileDir$/pylintrc -rn $FileDir$
  4. 设置你的工作目录为$FileDir$

现在使用pylint作为一个外部工具将运行pylint你select使用一个普通的configuration文件的任何目录,并使用任何解释器configuration为您的项目(这大概是你的virtualenv解释器)。

关键是将您的项目目录添加到sys.path而不考虑envvariables。

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

 [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) :将cwd添加到sys.path以满足命令行环境


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

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

我有这个相同的问题,并通过在我的virtualenv中安装pylint,然后添加一个.pylintrc文件到我的项目目录与文件中的以下内容:

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