Answers:
我知道有两个选择。
一,更改PYTHONPATH
环境变量,使其包含模块上方的目录。
或者,编辑~/.pylintrc
以包括模块上方的目录,如下所示:
[MASTER]
init-hook='import sys; sys.path.append("/path/to/root")'
(或者在其他版本的pylint中,init-hook要求您将[General]更改为[MASTER])
这两个选项都应该起作用。
希望有帮助。
~/.pylintrc
在OSX上为我工作,而另一个则不起作用
export PYTHONPATH
让pylint
看到它(至少在bash / zsh中)
更改路径的解决方案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()
。
.
(点)开头。
app
),则可以使用from pylint.config import find_pylintrc; import os, sys; sys.path.append(os.path.join(os.path.dirname(find_pylintrc()), 'app'))
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
pylint
按照以下建议通过将其安装到我的virtualenv中来解决此问题:plaidzooks.tumblr.com/post/36813101879
pylint --generate-rcfile > .pylintrc
在主文件夹中快速进行即可。
可以通过在venv下配置pylint路径来解决该问题:$ cat .vscode / settings.json
{
"python.pythonPath": "venv/bin/python",
"python.linting.pylintPath": "venv/bin/pylint"
}
{ "python.pythonPath": "${workspaceFolder}\\.venv\\Scripts\\python.exe" "python.linting.pylintPath": "${workspaceFolder}\\.venv\\Scripts\\pylint.exe" }
只是为了完整性。
The setting "python.pythonPath" defined in your settings.json is now deprecated.
如果删除该python.pythonPath
行,它似乎仍然可以工作。
您是否__init__.py
在两个目录中都有一个空文件来让python知道dirs是模块?
当您不在文件夹中运行时(例如,虽然不是我使用过的pylint),其基本轮廓是:
topdir\
__init__.py
functions_etc.py
subdir\
__init__.py
other_functions.py
这是怎样的Python解释器知道不参考当前目录中的模块,因此,如果pylint的是从自身的绝对路径运行它就能访问functions_etc.py
的topdir.functions_etc
或topdir.subdir.other_functions
,只要topdir
是对的PYTHONPATH
。
更新:如果问题不在于__init__.py
文件,也许只是尝试将模块复制或移动到c:\Python26\Lib\site-packages
-这是放置其他软件包的常见位置,并且肯定会在pythonpath上。如果您知道如何执行Windows符号链接或等效链接(我不知道!),则可以这样做。这里还有更多选项:http://docs.python.org/install/index.html,包括在开发代码的用户级目录后附加sys.path的选项,但实际上,我通常只是象征性地链接我将本地开发目录复制到站点软件包-将其复制具有相同的效果。
__init__.py
在两个目录中都有。我认为问题是运行PyLint时,顶层目录不在PYTHONPATH中,我不确定如何解决。
我在此页面上找到的关于此问题的一般答案请不要打开,网站显示错误
创建.pylintrc
并添加
[MASTER]
init-hook="from pylint.config import find_pylintrc;
import os, sys; sys.path.append(os.path.dirname(find_pylintrc()))"
我刚刚发现的一种解决方法是实际上只对整个软件包运行PyLint,而不是对单个文件运行。不知何故,它设法找到了导入的模块。
pylint ... dir
从父文件夹运行。这要求__init__.py
与.py
文件一起存在于每个子文件夹中。
尝试
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_import
从导入__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
心里。
编辑:现在为您的实际问题提供可能的解决方案。从包含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
操作,这比我的解决方案要优雅得多。)
关键是在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)
:添加cwd
以sys.path
满足命令行环境
仅供参考,这是我的.pylintrc:
https://gist.github.com/chuyik/f0ffc41a6948b6c87c7160151ffe8c2f
也许通过在PYTHONPATH内手动附加目录?
sys.path.append(dirname)
我遇到了同样的问题,因为我找不到答案,所以我希望这可以帮助任何有类似问题的人。
我用飞配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)
希望这可以帮助。
如果有人在寻找一种方法来将Pylint作为PyCharm中的外部工具运行并使其与他们的虚拟环境一起工作(为什么我要问这个问题),那么我将通过以下方式解决它:
$PyInterpreterDirectory$/pylint
--rcfile=$ProjectFileDir$/pylintrc -r n $FileDir$
$FileDir$
现在,使用pylint作为外部工具,可以在使用公共配置文件选择的任何目录上运行pylint,并使用为项目配置的任何解释器(大概是您的virtualenv解释器)。
安装Python时,可以设置路径。如果已经定义了路径,那么您可以在VS Code中进行操作,按Ctrl + Shift + P并键入Python:选择“解释器”并选择Python的更新版本。请点击此链接以获取更多信息,https://code.visualstudio.com/docs/python/environments
如果使用vscode,请确保您的软件包目录不在_pychache__目录中。
您好,我能够从其他目录导入软件包。我只是做了以下事情:注意:我正在使用VScode
创建Python软件包的步骤使用Python软件包确实非常简单。您需要做的只是:
创建一个目录,并为其指定软件包的名称。将课程放进去。在目录中创建一个初始化 .py文件
例如:您有一个名为Framework的文件夹,其中保存了所有自定义类,您的工作是在名为Framework的文件夹内创建一个init .py文件。
在导入时,您需要以这种方式导入->
从Framework导入库
因此E0401错误消失了,Framework是您刚在其中创建init .py 的文件夹,而base是您要自定义的模块,您需要将其导入并在该模块上工作,希望它能有所帮助!!!