1

嗨,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/mypackagesys.path.

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

  5. 执行语句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。

4

1 回答 1

0

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

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

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

于 2015-05-17T12:42:20.363 回答