python import 总结

163 阅读1分钟

新建一个目录test,目录结构如下

|____test -r:3
| |____outer.py
| |____dirA -r:1
| | |____A.py
| |____dirB -r:1
| | |____B.py

当前路径

当前路径指的是执行脚本时,所在的路径。

文件路径

文件路径指的是被执行的脚本文件所在的路径,它与当前路径可能不同。在运行时,python会自动将文件所在的路径添加到搜索路径中(即 sys.path)。

outer.py 中的文件内容

import sys
# 查看搜索路径
print(sys.path)
import os
# 查看执行路径
print(os.getcwd())

from dirA.A import a

outer='outer'
print(a)

实际查看一下

# 下文中的 *** 指代用户名
# 在test目录下,此时文件路径与执行路径相同
[*** test]$ python outer.py 
['/home/***/test', ......]
/home/***/test
dirA A.py

# 进入test上级目录,此时文件路径不变,执行路径成为上级目录
[*** test]$ cd ..
[*** ~]$ python test/outer.py 
['/home/***/test', ......]
/home/***
dirA A.py

明白了这两个概念后,再看 outer.py 文件中,想导入dirA目录下的文件,直接 import 就行,因为test会直接添加到搜索路径中,但是如果想在 A.py 中导入 B.py 时,就不能直接导入了,因为它们不在同一目录下。

A.py 中导入 B.py

如果 A.py 文件只会被 outer.py 引用,不会单独执行它的话,就可以直接from dirB.B import b 来引用 B,因为 test 目录会在搜索路径中,如果单独执行 A.py 文件的话,这样的导入方式就会出错。

[*** test]$ python dirA/A.py 
Traceback (most recent call last):
  File "dirA/A.py", line 1, in <module>
    from dirB.B import b
ModuleNotFoundError: No module named 'dirB'

sys.path

可以将 test 目录手动添加到搜索路径中。

import sys
# 添加到搜索路径
sys.path.append("/home/***/test")
from dirB.B import b

print(b)
a='dirA A.py'

# 执行成功
[*** test]$ python dirA/A.py      
dirB b.py

__init__.py 文件的作用

我们经常会在一个python文件夹下面看到 __init__.py 文件。

按照我现在的理解,这个文件的作用就是在这个文件夹被 import 时,会执行此文件,做一些操作,并且将此文件夹下的一些常用模块自动导入。

同样的来测试一下。

# 新建文件
|____test -r:10
| |____outer1.py
| |____dirA -r:6
| | |____tA.py
| | |______init__.py

[*** test]$ cat dirA/tA.py 
a1=1
a2=2
[*** test]$ cat dirA/__init__.py 
print('执行了dirA __init__.py')

# 将 a1 直接加载进来
from dirA.tA import a1

[*** test]$ cat outer1.py 
import dirA
print(dirA.a1)
print(dirA.a2)

# 可以看到 a1 可以直接通过 dirA 来访问,a2 不行,要访问 a2 的话得重新加载
[*** test]$ python outer1.py     
执行了dirA __init__.py
1
Traceback (most recent call last):
  File "outer1.py", line 3, in <module>
    print(dirA.a2)
AttributeError: module 'dirA' has no attribute 'a2'