Python导入如何真正起作用?在导入链中

时间:2015-05-17 12:00:08

标签: python python-2.7 import path sys.path

嗨同胞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环境变量中。

我目前的理解

执行流程:

  1. 开始运行run.py。包含目录PATH/myprogram的路径已添加到sys.path

  2. 执行语句from mypackage import foo。由于我们现在PATH/myprogram中有sys.path,解释程序可以找到mypackage,然后找到foo.py而没有问题。

  3. 开始运行foo.py,解释器将包含目录PATH/myprogram/mypackage的路径添加到sys.path

  4. 此时,PATH/myprogramPATH/myprogram/mypackage都包含在sys.path中。

  5. 执行语句import bar。由于我们已将PATH/myprogram/mypackage添加到sys.path,因此import语句可以成功执行而不会出现问题。

  6. 问题

    运行run.py后,我发现所有print sys.path语句都产生相同的输出。所有这些都包含PATH/myprogram但不包含PATH\myprogram\mypackage,这与我上面的理解相矛盾。

    似乎只为初始化进程的脚本添加了主目录路径。但如果是这种情况,那么import bar中的foo.py语句如果成功PATH\myprogram\mypackage }不在搜索路径中?

    BTW,我在MAC OS X机器上使用python 2.7。

1 个答案:

答案 0 :(得分:0)

sys.path不是python本身添加任何内容的地方。

路径被添加到模块缓存中,文档清楚地表明:https://docs.python.org/release/2.7/reference/simple_stmts.html#import

打印sys.modulessys.path_importer_cache以获取概述。缓存有run.py的路径,它可以从那里找到其他模块。