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

我怎么解决这个问题?


当前回答

在这两个目录中都有一个空的__init__.py文件来让python知道dirs是模块吗?

当你不是从文件夹中运行时(比如可能从pylint的文件夹中运行,尽管我没有用过),基本的大纲是:

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

这就是python解释器如何在不引用当前目录的情况下感知模块,因此如果pylint从它自己的绝对路径运行,它将能够以topdir的身份访问functions_etc.py。Functions_etc或topdir.subdir。other_functions,前提是topdir在PYTHONPATH上。

UPDATE: If the problem is not the __init__.py file, maybe just try copying or moving your module to c:\Python26\Lib\site-packages -- that is a common place to put additional packages, and will definitely be on your pythonpath. If you know how to do Windows symbolic links or the equivalent (I don't!), you could do that instead. There are many more options here: http://docs.python.org/install/index.html, including the option of appending sys.path with the user-level directory of your development code, but in practice I usually just symbolically link my local development dir to site-packages - copying it over has the same effect.

其他回答

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

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

如果您想从交给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]

如果你有一个python模块~/code/mymodule/,它的顶级目录布局是这样的

~/code/mymodule/
├── .pylintrc
├── mymodule/
│   └── src.py
└── tests/
    └── test_src.py

然后这将把~/code/mymodule/添加到你的python路径中,并允许pylint在你的IDE中运行,即使你正在导入mymodule。SRC在tests/test_src.py中。

你可以用.pylintrc来代替检查,但当涉及到python模块的根目录时,git目录通常是你想要的。

在你问之前

使用import sys, os;Sys.path.append(…)缺少一些东西来证明我的答案的格式。我通常不这样写代码,但在这种情况下,您将受困于处理pylintrc配置解析器和求值器的局限性。它实际上是在init_hook回调的上下文中运行exec,因此任何导入pathlib的尝试,使用多行语句,将一些东西存储到变量中,等等,都不会工作。

我的代码的一种不那么恶心的形式可能是这样的:

import os
import sys

def look_for_git_dirs(filename):
    has_git_dir = []
    filename_parts = filename.split(os.sep)
    for i, _ in enumerate(filename_parts):
        filename_part = os.path.abspath(os.path.join(os.path.sep, *filename_parts[:i]))
        if os.path.isdir(os.path.join(filename_part, '.git')):
            has_git_dir.append(filename_part)
    return has_git_dir[::-1]

# don't use .append() in case there's < 1 or > 1 matches found
sys.path += look_for_git_dirs(sys.argv[-1])

我希望我可以使用pathlib.Path(文件名)。父母们,这样事情就容易多了。

只需将此代码添加到.vscode/settings。json文件

,"python.linting.pylintPath": "venv/bin/pylint"

这将通知pylint的位置(这是python的错误检查器)

安装Python时,可以设置路径。如果path已经定义了,那么你可以在VS Code中,按Ctrl+Shift+P,输入Python:选择解释器,然后选择Python的更新版本。点击此链接获取更多信息,https://code.visualstudio.com/docs/python/environments

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

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

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

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

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

from Framework import base

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