嗨同胞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
}不在搜索路径中?
BTW,我在MAC OS X机器上使用python 2.7。
答案 0 :(得分:0)
sys.path不是python本身添加任何内容的地方。
路径被添加到模块缓存中,文档清楚地表明:https://docs.python.org/release/2.7/reference/simple_stmts.html#import
打印sys.modules
和sys.path_importer_cache
以获取概述。缓存有run.py的路径,它可以从那里找到其他模块。