Python从父目录导入并保持flake8愉快

2024-10-02 04:22:41 发布

您现在位置:Python中文网/ 问答频道 /正文

这种进口很好用,但有几点让人觉得脏兮兮的。主要是它使用slice*中的一个特定的数字来获取父路径,这会惹恼flake8 linter。在

import os
import sys
sys.path.append(os.path.dirname(__file__)[:-5])
from codeHelpers import completion_message

它在一个文件系统中看起来有点像:

^{pr2}$

child_folder实际上称为week1,因此片中有5)

这个问题与Python import from parent directory极为相似,但在这种情况下,讨论集中在从端点运行测试是否好。In my case,我有一系列目录,它们的代码使用父目录中的助手。在

每一个目录都是一组每周练习,所以我想让它们尽可能简单。在

有没有一种更干净、更像Python的方式来完成这种导入?在

@cco解决了数字问题,但还是让人心烦意乱。在


Tags: pathfromimport路径目录flake8oslinter
3条回答

首先,由于您还没有具体说明您得到的是哪个lint错误,所以我假设这是因为您在sys.path.append之后有一个导入。在

最干净的方法是相对进口或绝对进口。在

使用绝对导入:

from parent_path.codeHelpers import completion_message

使用相对导入:

^{pr2}$

对于原始问题中列出的简单示例,这应该是所需的全部内容。它很简单,是Python式的,很可靠,它解决了皮棉问题。在

您可能会发现自己处于这样一种情况:上面的方法对您不起作用,并且仍然需要sys.path操作。一个缺点是您的IDE可能无法解析从新路径到模块的导入,从而导致诸如自动代码完成不起作用以及将导入标记为错误等问题,即使代码可以正常运行。在

如果您发现仍然需要使用sys.path,并且希望避免这种情况下的lint错误,请创建一个新模块,并在其中执行sys.path操作。然后确保在任何需要修改的sys.path的模块之前导入新模块。在

例如:

本地_导入.py在

"""Add a path to sys.path for imports."""

import os
import sys

# Get the current directory
current_path = os.path.dirname(__file__)

# Get the parent directory
parent_path = os.path.dirname(current_path)

# Add the parent directory to sys.path
sys.path.append(parent_path)

然后在目标文件中:

import local_imports  # now using modified sys.path
from codeHelpers import completion_message

这样做的缺点是需要在每个child_folder中包含local_imports.py,如果文件夹结构发生变化,则必须修改每个local_imports文件。在

当您需要在包中包含外部库(例如在libs文件夹中)而不需要用户自己安装libs时,这种模式才是真正有用的。在

如果您将此模式用于libs文件夹,则可能需要确保您所包含的库优先于已安装的库。在

为此,改变

sys.path.append(custom_path)

sys.path.insert(1, custom_path)

这将使您的自定义路径成为python解释器要检查的第二个位置(第一个仍然是'',这是本地目录)。在

您可以使用..从一个模块导入一个更高级别的包。在这个_文件.py公司名称:

from ..codeHelpers import completion_message

如果你想更上一层的话,就继续加点。。。在

当我在这里时,请注意,from ..codeHelpers是一个相对导入,并且在导入同一个包中的内容时应该始终使用它们。from codeHelpers是一个绝对导入,在python2中是不明确的(它应该从包中导入还是从系统上安装的不幸命名的codeHelpers模块导入?)在python3中,实际上禁止从同一个模块中导入(也就是说,它们总是绝对的)。你可以阅读古代的PEP 328来解释这些困难。在

使用绝对导入路径可能更容易,如下所示:

from parent_folder.code_helpers import completion_message

但这需要您确保PYTHONPATH环境变量的设置能够使它看到最高的根目录(在本例中是parent_folder)。例如

^{pr2}$

确保在子目录中也添加一个__init__.py。在

相关问题 更多 >

    热门问题