python模块和导入

时间:2016-06-07 17:28:53

标签: python python-2.7 module python-import

如果这是我的目录树

n_cols

我在temp ├── __init__.py └── __main__.py 0 directories, 2 files __init__.py

中有以下代码

__初始化__。PY

__main__.py

__主__。PY

"""Initializes the module"""

CONSTANT = 1
sys.exit("what is happening here")

我在这里遇到两个问题,我想弄清楚

# from . import CONSTANT # from temp import CONSTANT if __name__ == "__main__": print "This should never run" 目录中运行python .时,我得到了输出 temp,是否应该首先使用This should never run文件初始化模块导致中止?

其次,如何在python模块中进行导入?我上面提到的两个选项都没有用。我在上面的代码中既不能__init__.py也不能from . import CONSTANT。做相对进口的正确方法是什么?

我在Python 2.7.5上运行它,如果之前已经被问过,请道歉。

3 个答案:

答案 0 :(得分:1)

您应该从temp目录中运行它。如果someDir包含您的temp目录,则:

someDir $ python -m temp   #someDir/temp/__init__.py is your file.
  

运行python。在临时目录中我得到输出这应该永远不会运行,不应该首先用 init .py文件初始化模块导致中止?

如果从外部运行,则会调用__init__.py。而且sys.exit也会被调用。

  

其次,如何在python模块中进行导入?我上面提到的两个选项都没有用。我做不到。在上面的代码中导入CONSTANT或临时导入CONSTANT。做相对进口的正确方法是什么?

你做得很好。只需在__init__.py文件中导入sys即可。并修复CONSTANT的拼写。

  

为什么我还需要-m标志?从temp的父目录中执行python temp是不是可以?

您需要-m标志来告诉您正在使用软件包。如果你不使用它,你将无法进行相对进口。

答案 1 :(得分:1)

您正在 temp内运行;这不被视为包,并且未加载__init__.py。仅当当前目录的 parent 位于模块加载路径上并且您明确加载temp作为模块时,才会加载__init__.py

由于temp 不是包,因此您无法在此处使用相对导入。相反,目录中的每个Python文件都被视为顶级模块。

您已移至temp目录的父级,然后运行:

python -m temp

让Python将temp作为包导入,然后在该包中运行__main__模块。

答案 2 :(得分:1)

当您告诉Python运行目录时, Python不会将该目录视为包。相反,Python adds that directory to sys.path and runs its __main__.py__init__.py未执行,相对导入不会将目录视为包。

如果你想运行一个包__main__.py并将其视为包的一部分,执行__init__.py并执行所有操作,请转到包含该包的目录并运行

python -m packagename