如何获取Python中的当前导入路径?

72 投票
4 回答
92620 浏览
提问于 2025-04-16 16:13

我在代码的某个地方遇到了一个ImportError错误,但在应用程序启动时同一个模块可以正常导入。我想知道Python在导入模块时会查找哪些路径,这样我就能追踪到这个问题的原因。我发现了这个:

print sys.path

这是系统在尝试导入模块时查找的所有路径的列表吗?

4 个回答

5

其他的回答几乎是正确的。

在Python 3中:

import sys
import_paths = sys.path

在Python 2.7中:

import sys
import os
import copy
import_paths = copy.copy(sys.path)
if '__file__' in vars(): import_paths.append(os.path.abspath(os.path.join(__file__,'..')))

在这两个版本中,主要的文件(也就是当__name__ == '__main'True时)会自动把它自己的目录添加到sys.path中。但是在Python 3中,只会从sys.path中导入模块。而在Python 2.7中,模块可以从sys.path和当前文件所在的目录中导入。这在你有这样的文件结构时很重要:

|-- start.py
|-- first_import
|   |-- __init__.py
|   |-- second_import.py

内容如下:
start.py:
import first_import
__init__.py:
import second_import.py

在Python 3中,直接运行__init__.py是可以的,但当你运行start.py时,__init__.py就无法import second_import.py,因为它不在sys.path里。

而在Python 2.7中,当你运行start.py时,__init__.py就能import second_import.py,即使它不在sys.path中,因为它和__init__.py在同一个文件夹里。

我想不出一个办法可以完美地在Python 3中复制Python 2.7的行为,真是遗憾。

13

如果你想让格式看起来更好一些:

import sys

from pprint import pprint

pprint(sys.path)
97

Python默认会检查一些特定的路径来寻找模块,你可以通过查看 sys.path 来了解这些路径。

import sys
print(sys.path)

撰写回答