如果这是我的目录树
n_cols
我在temp
├── __init__.py
└── __main__.py
0 directories, 2 files
和__init__.py
__main__.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上运行它,如果之前已经被问过,请道歉。
答案 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