引用
引用放在前,感谢这些大佬
引用1
引用2
引用3
最重要的一点来自这位大佬让我茅塞顿开
序言
从研一学习cs231n开始接触python,到现在研二了,import看了快上百遍,但是从没有真正搞懂过它,平时也主要是调用官方库,自己写的大型项目少之又少,今天要开始复现3D cycleGAN,发现自己动手写的时候连import的用法都模糊不清,研究生算法之路就从解决这几个难题开始!
正文
假设下图是我们所需要的文件树
pythonProject
|____ A.py
|____ B.py
|____ Branch1
|____C.py
|____D.py
|____Branch2
|____E.py
在理解所有概念之前,我们必须知道import是如何工作的,它到底是从哪里找的?
import 会从两个目录下进行查找:
- sys.path :通过运行代码import sys; print(sys.path)查看 ,我们可以在A.py中跟C.py中查看 注意红线。
A.py
import sys
for i in range(len(sys.path)):
print(sys.path[i])
结果:
再看看C.py
import sys
for i in range(len(sys.path)):
print(sys.path[i])
结果:
很明显除了已有的环境路径,跟项目根路径,不同的地方就在于文件所在目录也被存在了sys.path当中,所以同文件夹下的 .py 文件 可以互相直接import 。
那么我们就先在C.py中import D.py
c.py中代码改成下面
import sys
import D
for i in range(len(sys.path)):
print(sys.path[i])
在A.py中import B.py
import sys
import B
for i in range(len(sys.path)):
print(sys.path[i])
解决了同文件夹下的问题,那我就该考虑不同文件夹的问题
比如我想在A.py中引用C.py
那就需要使用 from import 了
A.py
import sys
import B
from Branch1 import C
for i in range(len(sys.path)):
print(sys.path[i])
运行一下
直接报错, 找不到D 因为这个时候我们的sys.path 里面是没有第一条的路径的!下图是执行C.py获得的路径!
如果需要成功运行,我们需要修改C.py
import sys
# import D 这里被修改
from . import D // 或者 from Branch1 import D 关于这两个区别请看引用2
for i in range(len(sys.path)):
print(sys.path[i])
在运行A.py就不会报错了。
这是为什么呢? 我们来关注一个变量 __name__
我们在A.py 跟C.py中添加
print("A __name__",__name__)
跟
print("C __name__",__name__)
可以看到作为执行文件的A __name__
变量名字是__main__
而作为被引用的文件C, __name__
变量记录了从根目录下来的完整路径!
导入自己写的文件,如果是非运行入口文件(上面的A.py是运行入口文件,可以使用绝对导入),则需要相对导入。
比如对于非运行入口文件C.py,其导入D.py需要使用相对导入: