from . import ,from module_name import ,import之间的关系

引用

引用放在前,感谢这些大佬
引用1
引用2
引用3
最重要的一点来自这位大佬让我茅塞顿开

序言

从研一学习cs231n开始接触python,到现在研二了,import看了快上百遍,但是从没有真正搞懂过它,平时也主要是调用官方库,自己写的大型项目少之又少,今天要开始复现3D cycleGAN,发现自己动手写的时候连import的用法都模糊不清,研究生算法之路就从解决这几个难题开始!

正文

假设下图是我们所需要的文件树

pythonProject
|____ A.py
|____ B.py
|____ Branch1
     |____C.py
     |____D.py
     |____Branch2
     	  |____E.py
     		

在理解所有概念之前,我们必须知道import是如何工作的,它到底是从哪里找的?
import 会从两个目录下进行查找:

  1. 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需要使用相对导入:

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值