"""
今日内容:
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. Python程序设计《集美大学各省成绩分析》

    分析文件‘集美大学各省录取分数.xlsx’,完成以下功能: 1)集美大学2015-2018年间不同省份在本一批的平均分数,柱状图展示排名前10的省份, 2)分析福建省这3年各批次成绩情况,使用折线图展 ...

  2. HDU 6048 - Puzzle | 2017 Multi-University Training Contest 2

    /* HDU 6048 - Puzzle [ 思维,结论 ] | 2017 Multi-University Training Contest 2 题意: 类似华容道的问题, N*M 的矩阵中N*M- ...

  3. access denied

    背景: 想要使用nginx转发 实现一个输出PHPinfo的页面, 比如: 访问  aaa.com/phpinfo  浏览器显示phpinfo的信息, 因为有的时候需要查看phpinfo, 所以想单独 ...

  4. Codeforces 576D Flights for Regular Customers (图论、矩阵乘法、Bitset)

    题目链接 http://codeforces.com/contest/576/problem/D 题解 把边按\(t_i\)从小到大排序后枚举\(i\), 求出按前\((i-1)\)条边走\(t_i\ ...

  5. IN和EXISTS、not in 和not exists的效率详解

    从效率来看: 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; T1数据量小而T2数据量非常大时,T1<& ...

  6. 使用vim编辑python智能提示

    一.vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.p ...

  7. Linux 查看网卡速率及版本

    查看网卡速率:ethtool 网卡名  如ethtool eth0 查看网卡驱动版本号:ethtool -i 网卡名   如ethtool -i eth0 示例: [root@nt3 ~]# etht ...

  8. github上打开或下载过慢的问题解决

    1.用站长工具查询github.com http://tool.chinaz.com/dns?type=1&host=github.com&ip= 2.找到“美国[海外]”项查到的ip ...

  9. UML 2.5版本与UML分类概述

    UML 2.5版本与UML分类概述 转 http://www.umlstudy.com/uml-25-diagrams.html UML简述 UML图是设计.实现或已经存在的系统模型的部分图形表示(视 ...

  10. UmUtils得到友盟的渠道号

    import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm ...