"""
今日内容:
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. [Web Component] Allow External Styling of a Web Component's Shadow DOM

    The Shadow DOM protects your components from style conflicts. The same protection also makes it hard ...

  2. 百度ueditor实现word图片自动转存

    官网地址http://ueditor.baidu.com Git 地址 https://github.com/fex-team/ueditor 参考博客地址 http://blog.ncmem.com ...

  3. [Luogu] 相关分析

    不想调了 #include <bits/stdc++.h> ; #define LL long long #define gc getchar() int fjs; struct Node ...

  4. node中fs内置模块

    Node.js内置的fs模块就是文件系统模块,负责读写文件. 和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法. 回顾一下什么是异步方法.因为JavaScript的单线程 ...

  5. 7.20T1

    排序(sort) [问题描述] 有 n 个人依次站在小 A 面前.小 A 会依次对这 n 个人进行 m 次操作. 每次操作选择一个位置 k,将这 n 个人中的所有身高小于等于当前 k 位置的 人的身高 ...

  6. Linux环境下Gitblit服务搭建及秘钥配置

    一.安装gitblit服务 1.下载地址 https://pan.baidu.com/s/1wQ3TEE_gw5xZvyFPZB9xFg 2.上传至linux服务器并解压缩 tar xvf gitbl ...

  7. 【洛谷4251】 [SCOI2015]小凸玩矩阵(二分答案,二分图匹配)

    题面 传送门 Solution 看到什么最大值最小肯定二分啊. check直接跑一个二分图匹配就好了. orz ztl!!! 代码实现 /* mail: mleautomaton@foxmail.co ...

  8. Redis 延迟指标监控

    Redis 延迟监控框架 Redis 2.8.13 引入了Latency Monitoring的一个新功能,可以帮助我们检查和排查引起延迟的原因. Latecny Monitoring 由如下组成: ...

  9. 预处理、const、static与sizeof-static全局变量与普通的全局变量有什么区别

    1:全局变量的说明之前再加上static就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式.这两者在存储方式上并无不同.这两者的区别在于,非静态全局变量的作用域是整 ...

  10. 什么叫Closed-form闭式解

    转自百度知道 与数值解对应的是解析解 闭式解closed form solution)也叫解析解(analytical solution),就是一些严格的公式,给出任意的自变量就可以求出其因变量,也就 ...