Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
Python 如何从子包装中实现绝对进口?_Python_Python 2.7 - Fatal编程技术网

Python 如何从子包装中实现绝对进口?

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吗?您可

包装中的进口产品让我感到困扰。 假设我有以下目录结构:

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吗?

您可以通过在交互式解释器中检查
sys.path
来研究这一点。您会发现,它的第一个元素是命令解释器运行的脚本的位置。这意味着当您在顶层(包的位置)运行脚本时,该位置将自动添加到
sys.path
。它与实际的包结构没有任何关系,因此如果您以脚本的形式运行
mod1.py
,您可能会遇到问题(这可能就是为什么您将脚本放在顶层!)

请注意,在Python2中,还存在隐式相对导入的问题,这不会影响您所问的问题,但是如果涉及更多的模块,可能会出现这个问题。如果将
mod3.py
添加到
sub1
,则只需
import mod3
,就可以从
mod1
导入它,并隐式计算
pack.sub1
前缀。这种隐式行为通常被认为是一件坏事,在Python3中不允许这样的隐式相对导入(您也可以在Python2中使用来自未来导入绝对导入的
禁用它们)。要从导入
pack.sub1.mod3
from
pack.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()