嗨,Pythonista 同胞,
虽然我已经使用 Python 进行编码已经有一段时间了,但最近我发现我对 Python 的导入机制的理解存在一些问题。
我希望你们能帮助我。提前致谢。非常感谢您的帮助。
设置
myprogram
┠━run.py
┗━mypackage
┠━ __init__.py
┠━ foo.py
┗━ bar.py
python文件的内容如下:
# run.py
import sys
print sys.path
from mypackage import foo
# foo.py
import sys
print sys.path
import bar
# bar.py
import sys
print sys.path
myprogram
它的任何子目录都不在环境PYTHONPATH
变量中。
我目前的理解
执行流程:
开始运行
run.py
。包含目录的路径PATH/myprogram
被添加到sys.path
.执行语句
from mypackage import foo
。由于我们现在PATH/myprogram
在 中sys.path
,解释器可以找到mypackage
,然后找到foo.py
没有问题。开始运行
foo.py
,解释器将包含目录的路径添加PATH/myprogram/mypackage
到sys.path
.此时,
PATH/myprogram
和PATH/myprogram/mypackage
都包含在 中sys.path
。执行语句
import bar
。由于我们PATH/myprogram/mypackage
添加了sys.path
,所以 import 语句可以顺利执行,没有问题。
问题
运行后run.py
,我发现所有print sys.path
语句都产生相同的输出。它们都包含PATH/myprogram
但不包含PATH\myprogram\mypackage
,这与我上面的理解相矛盾。
似乎只为初始化进程的脚本添加了主目录路径。但是如果是这种情况,那么如果不在搜索路径import bar
中,执行中的语句如何foo.py
成功?PATH\myprogram\mypackage
顺便说一句,我在 MAC OS X 机器上使用 python 2.7。