python--导入,模块的引用,包,__name__

简介: python--导入,模块的引用,包,__name__

__name__


创建一个py文件,命名为 demo1.py,写下面一行代码

print(__name__)

执行

从当前文件下运行,__name__就是__main__

在创建一个文件为demo2.py,导入demo1,运行demo2.py

从demo2.py 里导入 demo1,__name__ 为导入的文件名

if __name__=='__main__':

上面这句话,当从当前文件执行的时候是True,从别的文件里执行为 False

if __name__ == '__main__':

    所有不需要调用就能执行的内容


导入


所有模块的导入,都相当于把要导入的模块中的代码放到被直接执行的文件下执行了

import 模块
导入这个模块之后 模块内的所有名字 就都可以通过模块来引用了
模块名.名字
from 模块 import 名字
导入这个模块中的某个名字之后,这个名字就可以直接使用了
名字是变量 直接用
名字是函数 函数名()就是调用
名字是类名 类名()就是实例化
模块的循环引用 - 不能
把模块当成脚本运行 :
    你希望 某一段代码 在被当做模块导入的时候 不要执行
    就把它写在 if __name__ == '__main__':下面
sys.path 一个自定义模块能否被导入,就看sys.path列表中有没有这个模块所在的绝对路径
import 模块名  # ModuleNotFoundError : No module named '模块名'
从包中导入模块,要注意这个包所在的目录是否在sys.path
如果是直接导入一个包,那么相当于执行了这个包中的__init__文件
并不会帮你把这个包下面的其他包以及py文件自动的导入到内存
如果你希望直接导入包之后,所有的这个包下面的其他包以及py文件都能直接通过包来引用
那么你要自己处理__init__文件


导入时的注意点


重新加载模块 已经导入的模块即便被修改在程序执行过程中也不会生效
from  import导入了什么 就能使用什么 不导入的变量 不能使用
当模块中导入的方法或者变量 和 本文件重名的时候,那么这个名字只代表最后一次对它赋值的哪个方法或者变量
在本文件中对全局变量的修改是完全不会影响到模块中的变量引用的(a.py文件导入了b.py文件里的name="zou",在a.py里写name=123,在执行b.name,还是zou)
__all__可以控制*导入的内容
import sys
import my_module
sys.modules   存储了所有导入的文件的名字和这个文件的内存地址
{'sys':文件的内存地址,
'my_module': my_module的地址
'__main__':当前直接执行文件所在的地址}
再使用反射自己模块中的内容的时候
import sys
getattr(sys.modules[__name__],变量名)


模块之间的调用


import my_module

导入一个模块发生了如下几件事

  1. 找到这个模块,开辟一块属于这个模块的命名空间
  2. 执行这个模块下的所有东西
  3. 把模块里的东西加载在内存里
  4. 模块名指向这个地址

模块的搜索路径全部存储在 sys.path 列表中

导入模块的顺序,是从前到后找到一个符合条件的模块就立即停止不在向后寻找

如果要导入的模块和当前执行的文件同级,直接导入即可。如果要导入的模块和当前执行的文件不同级,需要把要导入模块的绝对路径添加到 sys.path 列表中

项目根目录为PycharmProjects,下面有个zouzou的目录,zouzou目录下有个day1-day15的目录,day1-day15下分别有个day1和day5的目录,day1下面有个test.py的文件。day5 下有个test1.py的文件,里面有个test2的函数

在day1下面的test.py写下面的代码 ,红色字体为结果

import sys, os
print(__file__)  # 当前运行目录下的相对路径,因为PyCharm是从根目录下查找的D:/PycharmProjects/zouzou/day1-day15/day1/test.py
print(os.path.abspath(__file__))  # 当前文件的绝对路径D:\PycharmProjects\zouzou\day1 - day15\day1\test.py
print(os.path.dirname(os.path.abspath(__file__)))  # 返回当前文件的目录绝对路径D:\PycharmProjects\zouzou\day1-day15\day1
print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
D:\PycharmProjects\zouzou\day1-day15
base_path=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(base_path)  # 将base_path加入到环境变量


模块的循环引用


在模块的导入中,不要产生循环引用问题,如果发生循环导入了就会发现明明写在这个模块中的方法,确显示找不到

还是上面的 demo1.py 和 demo2.py,分别写如下内容

demo1.py

import demo2
demo2.func()

demo2.py

import demo1
def func():
    print('in the demo2')

运行demo1时会报错



导入包,相当于执行了这个包下面的 __init__.py

# 如果这样导入了包下的policy,就要这样执行,点前面的都是包名,policy.py文件下有个get函数
import glance.api.policy
glance.api.policy.get()
import glance.api.policy as policy
policy.get()
from glance.api import policy
policy.get()

相关文章
|
18天前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
33 4
|
16天前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
101 63
|
18天前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
18天前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
10天前
|
Python 容器
[oeasy]python048_用变量赋值_连等赋值_解包赋值_unpack_assignment _
本文介绍了Python中变量赋值的不同方式,包括使用字面量和另一个变量进行赋值。通过`id()`函数展示了变量在内存中的唯一地址,并探讨了变量、模块、函数及类类型的地址特性。文章还讲解了连等赋值和解包赋值的概念,以及如何查看已声明的变量。最后总结了所有对象(如变量、模块、函数、类)都有其类型且在内存中有唯一的引用地址,构成了Python系统的基石。
20 5
|
18天前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
9天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!
|
8天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
15天前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
128 59
|
8天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
32 10