Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
派林;无法导入";错误-如何设置PYTHONPATH?_Python_Virtualenv_Pylint_Pythonpath - Fatal编程技术网

派林;无法导入";错误-如何设置PYTHONPATH?

派林;无法导入";错误-如何设置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

我在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 '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(".")'