导入是否在路径之前查看当前工作目录?还是cwd的路径?

时间:2018-03-22 00:15:35

标签: python python-3.x import python-import sys

以下哪项描述了from [...] import [...]的行为?

  • cwd first :首先查看工作目录,然后查看路径
  • 路径优先:查看路径,然后查看工作目录

请考虑以下脚本:

更改路径

sys.path.insert(0, 'E:\\demo_dir\\example_dir\\eg_dir\\test_dir\\')
from src import name
sys.path.pop(0)

更改Cwd

old_cwd = os.getcwd()
os.chdir('E:\\demo_dir\\example_dir\\eg_dir\\test_dir\\')
from src import name
os.chdir(old_cwd)

合并脚本

old_cwd = os.getcwd(); os.chdir('E:\\demo_dir\\example_dir\\eg_dir\\test_dir\\')
sys.path.insert(0, 'E:\\demo_dir\\example_dir\\eg_dir\\test_dir\\')

from src import name

os.chdir(old_cwd)
sys.path.pop(0)

假设sys.path和cwd中都有一个名为src的东西, 并且系统路径中的src与cwd中的src不同

我们刚刚从sys.path导入src吗?或来自cwd的src

1 个答案:

答案 0 :(得分:1)

sys.path用于搜索要作为模块加载的文件; Python不会查看sys.path之外的其他目录.¹仅当''(空字符串)在路径²中时才会搜索当前工作目录,因此如果有src.py在当前工作目录和路径中的另一个目录中,将要加载的那个目录中的第一个。

当您直接运行Python解释器时(包括运行''时),您会发现sys.path自动显示在python -m modulename的前面。这是standard Python behaviour。但是,如果您直接运行脚本(例如,只用myscript键入#!/usr/bin/env python)而不是脚本的目录(例如/usr/bin,如果您的shell找到并运行/usr/bin/myscript })将被添加到路径的前面。 (脚本本身当然可以在路径运行时将更多项添加到路径的前面。)

¹实际上,这并非完全正确; import首先在sys.meta_path中查询查找程序。这些可以看起来任何他们喜欢的地方,甚至可能不会使用sys.path ²你也可以在路径中使用../.或各种类似的想法,虽然这样的狡猾只是在寻找麻烦。