Python 如何从子包装中实现绝对进口?
包装中的进口产品让我感到困扰。 假设我有以下目录结构: pack ├── __init__.py ├── sub1 │ ├── __init__.py │ └── mod1.py └── sub2 ├── __init__.py └── mod2.py 我在包含导入pack/sub1/mod1.py的pack的目录中有一个main.py文件Python 如何从子包装中实现绝对进口?,python,python-2.7,Python,Python 2.7,包装中的进口产品让我感到困扰。 假设我有以下目录结构: pack ├── __init__.py ├── sub1 │ ├── __init__.py │ └── mod1.py └── sub2 ├── __init__.py └── mod2.py 我在包含导入pack/sub1/mod1.py的pack的目录中有一个main.py文件 mod1.py如何访问pack?pack与mod1.py不在同一目录中。python会自动将最顶层的包添加到sys.path吗?您可
mod1.py如何访问pack?pack与mod1.py不在同一目录中。python会自动将最顶层的包添加到sys.path吗?您可以通过在交互式解释器中检查
sys.path
来研究这一点。您会发现,它的第一个元素是命令解释器运行的脚本的位置。这意味着当您在顶层(包的位置)运行脚本时,该位置将自动添加到sys.path
。它与实际的包结构没有任何关系,因此如果您以脚本的形式运行mod1.py
,您可能会遇到问题(这可能就是为什么您将脚本放在顶层!)
请注意,在Python2中,还存在隐式相对导入的问题,这不会影响您所问的问题,但是如果涉及更多的模块,可能会出现这个问题。如果将mod3.py
添加到sub1
,则只需import mod3
,就可以从mod1
导入它,并隐式计算pack.sub1
前缀。这种隐式行为通常被认为是一件坏事,在Python3中不允许这样的隐式相对导入(您也可以在Python2中使用来自未来导入绝对导入的禁用它们)。要从导入pack.sub1.mod3
frompack.sub1.mod1
您需要完整命名它,或者使用显式相对导入:from。导入mod3
要将此相对导入业务与您的问题联系起来,如果您希望避免依赖pack
作为sys.path
的一部分(或者更现实地说,防止更改pack
的名称),您可以将mod2
从mod1
导入修改为显式相对导入。只需使用来自的。。导入sub2.mod2
当您不确定时,始终可以检查sys.path。Python通常包含当前目录和PYTHONPATH中的目录。因此,当我以脚本形式运行main.py时,main.py的sys.path列表与mod1.py的sys.path列表相同?是的,sys.path
在整个解释器运行过程中保持不变(当然,除非您使用自己的代码对其进行修改)。无论从何处导入,都会得到相同的sys
模块!如果从包含main.py的目录运行mod1.py,为什么它不起作用?(而不是运行main.py并让它导入mod1.py)@asad:看起来我说错了sys.path[0]
的来源。say it“是包含用于调用Python解释器的脚本的目录。”我编辑了答案以给出更正确的解释。。导入sub2.mod2似乎不起作用。我有个语法错误。
# mod1.py
import pack.sub2.mod2
pack.sub2.mod2.helloworld()