这种进口很好用,但有几点让人觉得脏兮兮的。主要是它使用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解决了数字问题,但还是让人心烦意乱。在
首先,由于您还没有具体说明您得到的是哪个lint错误,所以我假设这是因为您在
sys.path.append
之后有一个导入。在最干净的方法是相对进口或绝对进口。在
使用绝对导入:
使用相对导入:
^{pr2}$对于原始问题中列出的简单示例,这应该是所需的全部内容。它很简单,是Python式的,很可靠,它解决了皮棉问题。在
您可能会发现自己处于这样一种情况:上面的方法对您不起作用,并且仍然需要
sys.path
操作。一个缺点是您的IDE可能无法解析从新路径到模块的导入,从而导致诸如自动代码完成不起作用以及将导入标记为错误等问题,即使代码可以正常运行。在如果您发现仍然需要使用
sys.path
,并且希望避免这种情况下的lint错误,请创建一个新模块,并在其中执行sys.path
操作。然后确保在任何需要修改的sys.path
的模块之前导入新模块。在例如:
本地_导入.py在
然后在目标文件中:
这样做的缺点是需要在每个
child_folder
中包含local_imports.py
,如果文件夹结构发生变化,则必须修改每个local_imports
文件。在当您需要在包中包含外部库(例如在
libs
文件夹中)而不需要用户自己安装libs时,这种模式才是真正有用的。在如果您将此模式用于
libs
文件夹,则可能需要确保您所包含的库优先于已安装的库。在为此,改变
到
这将使您的自定义路径成为python解释器要检查的第二个位置(第一个仍然是
''
,这是本地目录)。在您可以使用
..
从一个模块导入一个更高级别的包。在这个_文件.py公司名称:如果你想更上一层的话,就继续加点。。。在
当我在这里时,请注意,
from ..codeHelpers
是一个相对导入,并且在导入同一个包中的内容时应该始终使用它们。from codeHelpers
是一个绝对导入,在python2中是不明确的(它应该从包中导入还是从系统上安装的不幸命名的codeHelpers
模块导入?)在python3中,实际上禁止从同一个模块中导入(也就是说,它们总是绝对的)。你可以阅读古代的PEP 328来解释这些困难。在使用绝对导入路径可能更容易,如下所示:
但这需要您确保PYTHONPATH环境变量的设置能够使它看到最高的根目录(在本例中是
^{pr2}$parent_folder
)。例如确保在子目录中也添加一个
__init__.py
。在相关问题 更多 >
编程相关推荐