派林;无法导入";错误-如何设置PYTHONPATH?
我在Windows上从内部Wing IDE运行PyLint。我在我的项目中有一个子目录(包),在包中我从顶层导入一个模块,即派林;无法导入";错误-如何设置PYTHONPATH?,python,virtualenv,pylint,pythonpath,Python,Virtualenv,Pylint,Pythonpath,我在Windows上从内部Wing IDE运行PyLint。我在我的项目中有一个子目录(包),在包中我从顶层导入一个模块,即 __init__.py myapp.py one.py subdir\ __init__.py two.py 在two.py内部,我有importone,这在运行时可以正常工作,因为顶级目录(运行myapp.py的目录)位于Python路径中。但是,当我在two.py上运行PyLint时,它会给我一个错误: F0401: Unable to import
__init__.py
myapp.py
one.py
subdir\
__init__.py
two.py
在two.py
内部,我有importone
,这在运行时可以正常工作,因为顶级目录(运行myapp.py
的目录)位于Python路径中。但是,当我在two.py上运行PyLint时,它会给我一个错误:
F0401: Unable to import 'one'
如何修复此问题?在这两个目录中是否都有一个空的
\uuuu init\uuuuu.py
文件,以让python知道dir是模块
当您不是从文件夹中运行时(即可能是从pylint的,尽管我没有使用它),基本的大纲是:
这就是python解释器在不参考当前目录的情况下感知模块的方式,因此如果pylint从其自身的绝对路径运行,它将能够访问functions\u etc.py
作为topdir.functions\u etc
或topdir.subdir.other\u函数,提供的topdir
位于PYTHONPATH
上
更新:如果问题不是\uuuu init\uuuuu.py
文件,那么可以尝试将模块复制或移动到c:\Python26\Lib\site packages
——这是放置其他包的常见位置,并且肯定会出现在pythonpath上。如果您知道如何创建Windows符号链接或类似的链接(我不知道!),您可以这样做。还有更多的选项,包括将sys.path附加到开发代码的用户级目录,但实际上我通常只是象征性地将本地开发目录链接到站点包-复制它也有同样的效果。可能是通过在PYTHONPATH中手动附加目录
sys.path.append(dirname)
我刚刚发现的一个解决方法是,实际上只对整个包而不是单个文件运行PyLint。不知何故,它设法找到了导入的模块。我知道有两个选项
第一,更改PYTHONPATH
环境变量以包含模块上方的目录
或者,编辑~/.pylintrc
以包含模块上方的目录,如下所示:
[MASTER]
init-hook='import sys; sys.path.append("/path/to/root")'
(或者在pylint的其他版本中,init钩子要求您将[General]更改为[MASTER])
这两种选择都应该奏效
希望有帮助。试试看
请注意,在Python3中,else
子句中部分的语法为
from .. import one
仔细想想,这可能无法解决您的具体问题。我误解了这个问题,认为two.py是作为主模块运行的,但事实并非如此。考虑到Python2.6(不从\uuuu future\uuuuu
导入absolute\u import)和Python3.x处理导入的方式的不同,我认为,无论如何,Python2.6都不需要这样做
尽管如此,如果您最终切换到Python3并计划将一个模块同时用作包模块和包内的独立脚本,那么保留它可能是一个好主意
差不多
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
记住
编辑:现在为您的实际问题提供一个可能的解决方案。从包含one
模块的目录运行PyLint(可能通过命令行),或者在运行PyLint时将以下代码放在某个位置:
import os
olddir = os.getcwd()
os.chdir([path_of_directory_containing_module_one])
import one
os.chdir(olddir)
基本上,作为摆弄PYTHONPATH的替代方法,在执行导入时,只需确保当前工作目录是包含one.py
的目录
(看看Brian的答案,你可能会将前面的代码分配给init_hook
,但是如果你要这样做,你可以简单地添加到他所做的sys.path
,这比我的解决方案稍微优雅一点。)我不知道它如何与WingIDE一起工作,但对于与Geany一起使用PyLint,我将外部命令设置为:
PYTHONPATH=${PYTHONPATH}:$(dirname %d) pylint --output-format=parseable --reports=n "%f"
其中%f是文件名,%d是路径。可能对某人有用:)我也有同样的问题,因为我找不到答案,我希望这能帮助任何有类似问题的人
我将flymake与epylint一起使用。基本上,我所做的是添加一个dired模式钩子来检查dired目录是否是python包目录。如果是,我将其添加到蟒蛇路径。在我的例子中,如果目录包含一个名为“Studio.py.t/.P>”的文件,我认为目录是一个Python包。
希望这能有所帮助。1)sys.path是一个列表
2) 问题是有时sys.path不是您的virtualenv.path并且您希望在virtualenv中使用pylint
3) 如前所述,使用init hook(注意“和”中pylint的解析是严格的)
或
…及
pylint --rcfile /path/to/pylintrc /path/to/module.py
如果有人想在PyCharm中将pylint作为一个外部工具运行,并让它与他们的虚拟环境一起工作(为什么我会提出这个问题),下面是我解决这个问题的方法:
在PyCharm>首选项>工具>外部工具中,添加或编辑pylint的项目
在“编辑工具”对话框的工具设置中,将程序设置为使用python解释器目录中的pylint:$PyTransporterDirectory$/pylint
在参数字段中设置其他参数,如:--rcfile=$ProjectFileDir$/pylintrc-r n$FileDir$
将工作目录设置为$FileDir$
现在使用pylint作为外部工具将在您使用公共配置文件选择的任何目录上运行pylint,并使用为您的项目配置的任何解释器(可能是您的virtualenv解释器).关键是将项目目录添加到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\u dir,os.getcwd()).group()
:find base
;;;;;;;;;;;;;;;;;
;; 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)
[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
[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)'
[Master]
init-hook='sys.path = list(); sys.path.append("./Lib/site-packages/")'
[MASTER]
init-hook="from pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
{
"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/pylint"
}
from .. import one
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'))"
[MASTER]
init-hook="from pylint.config import find_pylintrc;
import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/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]
~/code/mymodule/
├── .pylintrc
├── mymodule/
│ └── src.py
└── tests/
└── test_src.py
{
"python.pythonPath": "/Users/username/opt/anaconda3/bin/python",
"python.linting.pylintPath": "/Users/username/opt/anaconda3/bin/python"
}
[MASTER]
init-hook='import sys; sys.path.append(".")'