"""
今日内容:
1、导入模块的细节
2、包的概念及使用
3、包的相对导入
""" """
1、导入模块的细节
-- 在进行模块的导入时,进行的都是绝对路径的导入,
-- 这是由于在执行文件过程中,会将执行文件所在的目录加入到sys.path(环境变量)中,虽然看起来在文件中只是import 模块名,但是系统会直接到sys.path中的绝对路径下寻找
-- 在pycharm执行文件时,系统不仅会将执行文件所在的目录添加进sys.path(环境变量)中,同时pycharm窗口中最大的那个文件夹也会自动加入到sys.path中
-- 但是在命令行中执行文件时,系统只会将执行文件当前所在的文件夹加入到sys.path(环境变量)中 -- 1、跨文件导入模块
-- 1、文件与被导入模块在一个目录下:由于文件在执行过程中,会将自己文件所在的目录加入到环境变量中(sys.path),所以同文件下可以直接进行导入
-- 2、执行文件与被导入模块不在同一个目录下,但是两者所在的目录处于同一个文件夹下,在pycharm中由于会默认将pycharm中最大的窗口加入到环境变量中,所以进行导入时不会报错
举例:
想要在 H:\py8-study\practice\day17\今日内容.py 文件中调用 H:\py8-study\practice\day04\while循环练习.py文件,且在pycharm中根目录为 practice 进行的操作为:
-- from day04 import while循环练习 -- 3、如果执行文件与被导入模块不在同一个文件夹下,那么进行导入时会报错,此时需要在执行文件中使用sys.path.append()将模块的绝对路径添加进环境变量中
-- 【注】:需要注意的是,系统会主动将sys.path中绝对路径加入到导入的模块前方,所以只需要将路指明径剩下的部分就可以,如果路径名与sys.path中有重叠的部分也会报错
# 举例:
想要将 r'C:\Users\Andy\Desktop\acb.py' 作为模块导入到执行文件中,此时,在执行文件中的操作是:
-- import sys
-- sys.path.append(r'C:\Users\Andy\Desktop')
-- import acb -- 【需要注意的事】:在实际代码及模块的编写过程中,一般不需要自己手动添加sys.path中的路径
-- 因为我觉得在实际开发中如果想要调用模块会将模块与被执行文件放进相同的目录下或者放在同一个项目下,或者使用相对导入,这样会提高代码的可移植性,不容易报错。 -- 【重点】:在进行模块的导入时,需要遵循一定的规则,这个规则就是:
-- 1、使用 import 导入模块时,最多只能导入到文件一级,因为 . 前面必须是文件夹名称
-- 2、使用from...import...进行导入时,也必须遵循 . 前面必须是文件夹名称的规则 -- 2、模块执行的两种方式
-- 1、作为自执行文件:直接执行文件自身
-- 2、作为模块进行执行:将文件作为模块进行导入执行
-- 【注】:需要注意的是,由于代码需要测试,我们经常会在模块中进行测试执行,但是又不想在导入模块时使文件中测试执行代码运行,此时就需要一个值来区分是本文件执行还是导入执行
-- 这个值就是__name__
-- 在本文件执行时,__name__ == "__main__"
-- 在非本文件执行时,__name__ == "模块名"
""" """
2、包的概念及使用
-- 什么是包?
-- 包就是一系列具有相似功能的模块的集合体,为了管理方便,会用文件夹来管理这一系列模块,这个文件夹就是包,文件夹名就是包名
-- 包与普通文件夹的区别?
-- 在创建包时,会在包的根目录下创建一个__init__.py文件,这个__init__.py文件的名称空间就是这个包的名称空间
-- 在导入包时只需要导入包名就可以,将想要外界访问的功能添加进__init__.py的名称空间中就可以,可以直接通过 包名.的方法进行执行
-- 导入包时完成的三件事:
-- 1、在导入包时,会首先进行编译,将__init__.py文件编译成.pyc文件
-- 2、执行__init__文件中的内容,将其中的变量放入__init__模块的全局名称空间中,在使用 包名. 语法时会直接访问__init__的全局名称空间
-- 3、在执行文产生一个与包名同名的变量,可以直接通过 包名. 语法访问包中的量
-- 【注】:在py3中会自动创建__init__文件,直接导入包名不会报错,但是在py2中不会自动创建,如果直接导入包名会报错。 -- 如果想要访问包中的变量或模块有两种办法:
-- 1、直接通过绝对路径进入包中访问想要访问的变量或模块(此种方法不需要在包中设置__init__文件,因为次访问不会访问包的名称空间)
-- 2、使用 包名. 的语法访问包中的变量及模块(此方法需要设置__init__文件,因为此方法是通过 包名. 的语法直接访问包中的变量及模块名,首先需要在包的名称空间中产生这些名字) -- 采用 包名. 语法访问包中变量或模块时需要注意的问题(包的管理):
-- 1、 在执行文件中直接导入包名时,需要在__init__文件中设置好想要被外界访问变量
-- 设置方法为采用相对路径的方式
-- 由于在导入包名时会进入包中执行包中的文件,所以此时根目录就相当于是这个包,在__init__文件中只需要使用from . import 模块名 就可以将模块名添加进包的名称空间中
-- 实例:from .l111 import m111 就可以直接将 m111这个模块名直接放入包的全局名称空间中。
-- 2、在包中,可以使用 .来表示当前文件夹 | 使用 .. 来表示当前文件夹的上一级文件夹
--【需要注意的是:】
-- 在包中使用 .. 语法访问上一级目录时,是不能出包的,如果出包会报错
-- ValueError: attempted relative import beyond top-level package
-- 在包中的文件是不能自执行的,因为包中的模块可能会包含有 from . import 模块名的语法,此时如果自执行文件会报错,因为 .前面肯定会增加一个路径
-- 如果是自执行会把 __main__作为路径加入到.前面,导致报错 """

day17 包与相对路径的更多相关文章

  1. springBoot 项目war包部署及改为war包后资源路径错误问题

    参考资料: https://blog.csdn.net/rico_zhou/article/details/83415114 https://blog.csdn.net/pz641/article/d ...

  2. linux下 彻底修改python的包/模块导入路径

    python模式下,有时候需要导入  import某些模块或者包.明明这个模块/包是存在的,却提示导入错误,比如,“ImportError: No module named lxml”. 但是当你在命 ...

  3. 22.访问jar包下资源路径里的文件

    访问jar包下资源路径里的文件 因为打包路径和你构建的代码路径是有差异的,想要查看真实的路径情况,可以查看编译后的classes目录下的文件结构. 想要获取资源文件流: private InputSt ...

  4. mysql 开发进阶篇系列 30 数据库二进制包(安装指定路径,目录介绍)

    一. 指定路径 在上一篇里,二进制包解压后,全部放入在/usr/local/mysql目录下,在安装时指定了基础目录和数据目录, --basedir=/usr/local/mysql --datadi ...

  5. 获取jar包当前的路径

    转自:http://kinganpo.iteye.com/blog/876243 import java.io.File; /** * 获取打包后jar的路径信息 * @author Administ ...

  6. jmeter的Classpath即类或者jar包的搜索路径设置

    对于master-slave模式,插件和依赖都需要放到slave上才能生效,并且需要重启slave使插件生效 查看配置文件:apache-jmeter-3.1/bin/jmeter.propertie ...

  7. struts2,hibernate等模板配置文件在jar包中的路径,以及所需要的包

    一.struts2 1.struts的配置模板文件struts-default.xml的位置: struts-2.3.16.1 --> src --core --> src --> ...

  8. java war包 路径--解决war包中文件路径问题

    https://blog.csdn.net/u013409283/article/details/51480948 转自:http://free-chenwei.iteye.com/blog/1507 ...

  9. django-导入应用包的搜索路径

    创建应用包 在 settings.py注册和配置urls.py中要按顺序导入包名和应用名 settings.py INSTALLED_APPS = ( 'django.contrib.admin', ...

随机推荐

  1. 本地资源图片无法通过 WXSS 获取,可以使用网络图片,或者 base64,或者使用<image/>标签

    在微信小程序开发中,当在CSS中使用背景图片格式为png时就会出现: 只要把png格式改掉就可以或者在<image/>标签里面写,我实测用JPG格式和把图片转成base64是没问题的.

  2. toggle([speed],[easing],[fn]) 用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件。

    toggle([speed],[easing],[fn]) 概述 用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件. 如果元素是可见的,切换为隐藏的:如果元素是隐藏的,切换为 ...

  3. code命令用vscode打开项目代码

    1. 打开vscode, 使用Command + shift + p, 输入shelll 选择

  4. 路由器配置——RIP路由

    一.实验目的:用rip路由实现全网互通 二.拓扑图: 三.具体步骤配置 (1)R1路由器配置 Router>enable  --进入特权模式Router#configure terminal   ...

  5. Pytest学习笔记(三) 在代码中运行pytest

    前面介绍的是在cmd中执行pytest,平常我们一般都是通过编译器(如pycharm)来编写用例的,写完用例后,需要调试看看是否能运行,如果每次都切换到cmd中执行,太麻烦. 因此,这一节来说下怎么在 ...

  6. python3 threading.Lock() 多线程锁的使用

    import threadingimport time lock = threading.Lock() #创建锁 def fun(data): try: lock.acquire(True) #锁定 ...

  7. SpringSecurity学习总结

    第一.SpringSecurity-简介 1.1简介 SpringSecurity融合Spring技术栈,提供JavaEE应 用的整体安全解决方案: Spring Security为基于Java EE ...

  8. windows下安装MongoDB服务

    1,参考:https://www.cnblogs.com/lecaf/p/mongodb.html 2,要设置环境变量 3,设置用户 use admin  注:MongoDB安装好以后由默认的admi ...

  9. LeetCode 279. 完全平方数(Perfect Squares)

    题目描述 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: 3 解释 ...

  10. OriginPro 9.1 科研图标绘制入门

    OriginPro 9.1 科研图标绘制入门 目的:1.介绍如何不用编程画出复杂多样的图表2.介绍OriginLab 常用功能3.科研报告时,有效绘图,省却时间 科研发展需求.反映专业形象.满足公司要 ...