Python模块及其导入

一、模块

1、模块的定义:

    为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,

  很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。

2、使用模块的好处:

  <1> 提高了代码的可维护性,其次,可以被其他地方引用。

  <2> 使用模块可以避免函数名和变量名冲突。

3、模块分类

  分为三种:

    <1> 内置标准模块(又称标准库)执行help('modules')查看所有python自带模块列表。

    <2> 第三方开源模块,可通过pip install 模块名 联网安装。

    <3> 自定义模块

4、模块调用的方法

  import module

  from module import xx

  from module.xx.xx import xx as rename

  from module.xx.xx import

  注意:模块一旦被调用,就相当于执行了另一个py文件里的代码。

5、自定义模块

  所谓自定义模块,就是创建了一个.py文件,就可以称之为模块,可以在另一个程序里导入。

6、模块查找路径

  自定义模块只能在当前路径下的程序里才能导入,换一个目录再导入自己的模块就报错说找不到了, 这是为什么?

  这与导入路径有关

    import sys

    print(sys.path)

  输出:['', '/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip''/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6', 

'/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload''/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages']

  python解释器会按照列表顺序去依次到每个目录下去匹配你要导入的模块名,只要在一个目录下匹配到了该模块名,就立刻导入,不再继续往后找。
  注意:列表第一个元素为空,即代表当前目录,所以你自己定义的模块在当前目录会被优先导入。

7、开源模块安装与使用
  https://pypi.python.org/pypi 是python的开源模块库,如何从这个平台上下载代码呢?
  1.直接在上面这个页面上点download,下载后,解压并进入目录,执行以下命令完成安装
    编译源码 python setup.py build
     安装源码 python setup.py install
  2、直接通过pip安装
    
pip3 install paramiko #parmiko 是模块名
    pip命令会自动下载模块包并完成安装,软件一般会被自动安装你python安装目录的这个子目录里
    
/your_python_install_path/3.6/lib/python3.6/site-packages   

  pip命令默认会连接在国外的python官方服务器下载,速度比较慢,你还可以使用国内的豆瓣源,数据会定期同步国外官网,速度快好多

  sudo pip install -i http://pypi.douban.com/simple/ alex_sayhi --trusted-host pypi.douban.com #alex_sayhi是模块名

二、包(package)    
  
└── my_proj├── crm #代码目录│   ├── admin.py│   ├── apps.py│   ├── models.py│   ├── tests.py│   └── views.py├── manage.py└── my_proj #配置文件目录├── settings.py├── urls.py
  像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包。
  

    crm/views.py内容

    def sayhi():      print('hello world!') 

    通过manage.py调用

    from crm import viewsviews.sayhi()
  执行manage.py,pthon3中可以执行,但python2会出问题。
    
包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。


  在crm目录下创建一个空文件__int__.py ,再执行一次就可以了。
  注意,在python3里,即使目录下没__int__.py文件也能创建成功,猜应该是解释器优化所致,但创建包还是要记得加上这个文件 。
跨模块导入
  如何实现在crm/views.py里导入proj/settings.py模块呢?
  直接导入会报错找不到模块。
  因为路径找不到,proj/settings.py 相当于是crm/views.py的父亲(crm)的兄弟(proj)的儿子(settings.py),
settings.py算是views.py的表弟啦,在views.py里只能导入同级别兄弟模块代码,或者子级别包里的模块,
根本不知道表弟表哥的存在。该怎么做呢?
   添加环境变量,把父亲级的路径添加到sys.path中,就可以了,这样导入 就相当于从父亲级开始找模块了。
# crm/views.py中添加环境变量
import sys ,osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印当前被执行的模块.py文件相对路径,注意是相对路径
print(BASE_DIR)sys.path.append(BASE_DIR)  from proj import settingsdef sayhi():print('hello world!')

  注意;此时在proj/settings.py写上import urls会有问题, 因为现在的程序入口是views.py , 你在settings.py导入import urls,

其实相当于在crm目录找urls.py,而不是proj目录,若想正常导入,要改成如下:

from proj import urls  #proj这一层目录已经添加到sys.path里,可以直接找到
print('in proj/settings.py')

三、绝对导入和相对导入

├── __init__.py
├── crm
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   ├── views.py  #from ..proj import settings 
├── manage.py   
└── proj├── __init__.py├── settings.py #from .import urls  
    ├── urls.py└── wsgi.py
# views.py里代码from ..proj import settings
def sayhi():print('hello world!')print(settings.DATABASES)

这样执行会报错。

  在涉及到相对导入时,package所对应的文件夹必须正确的被python解释器视作package,而不是普通文件夹。

否则由于不被视作package,无法利用package之间的嵌套关系实现python中包的相对导入。 

文件夹被python解释器视作package需要满足两个条件:

  1. 文件夹中必须有__init__.py文件,该文件可以为空,但必须存在该文件。
  2. 不能作为顶层模块来执行该文件夹中的py文件(即不能作为主函数的入口)。

  所以这个问题的解决办法就是,既然你在views.py里执行了相对导入,那就不要把views.py当作入口程序,

可以通过上一级的manage.py调用views.py。

  from .. import models会报错的原因是,这句代码会把manage.py所在的这一层视作package,但实际上它不是,

因为package不能是顶层入口代码,若想不出错,只能把manage.py往上再移一层。

# 正确的代码目录结构如下
packages/├── __init__.py├── manage.py #from my_proj.crm  import views
    └── my_proj├── crm│   ├── admin.py│   ├── apps.py│   ├── models.py│   ├── tests.py│   ├── views.py  #from . import models;  from ..proj import settings 
        └── proj├── __init__.py├── settings.py├── urls.py└── wsgi.py

再执行manage.py就不会报错了。

注意:虽然python支持相对导入,但对模块间的路径关系要求比较严格,处理不当就容易出错,
  不建议使用。

以上内容摘录与总结于:https://www.luffycity.com/python-book/di-4-zhang-python-ji-chu-2014-chang-yong-mo-kuai/mo-kuai-3001-bao-jie-shao-he-xiang-guan-yu-fa.html
 

转载于:https://www.cnblogs.com/schut/p/8436138.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/428156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L1-046 整除光棍 (20 分)

这道题的解题过程真是一波三折&#xff0c;也真是发现人外有人&#xff0c;天外有天&#xff0c;好多神人真是。 原题如下图&#xff0c;也可点击这个链接到原题自己测试光棍原题链接: 一开始做的时候的想法&#xff1a;so easy&#xff0c;虽然看到了题目中提示s可能超级大…

python内存模型_内存篇3:CPython的内存管理架构-L2-块

本篇用到了C/C的内存对齐的基础知识&#xff0c;我已经假定你有C/C内存管理的相关基础。我们在前一篇的流程图中留下了两个黑箱子,会涉及到内存模型第一层以上的其他话题&#xff0c;回顾下面关于第一层面向类型的内存API流程执行图。本篇要讨论其中一个黑箱就是何为物&#xf…

软件测试_入行

软件测试&#xff0c;入行太简单了。1. 看一本软件测试理论书籍 。2. 看一点数据库知识&#xff08;增删改查&#xff09;。3. 看一点Linux常用命令&#xff08;30个够了&#xff09;。4. 了解几个行业内容的测试工具&#xff08;如Jira Zentao LR Jmeter Fiddler 等&#xff0…

L1-056 猜数字 (20 分)

这道题做法倒是多样化&#xff0c;可以使用结构体&#xff0c;也可以使用多个数组做&#xff0c;不过为了复习一下好久没用过的结构体&#xff0c;我是用结构体做的。 这道题可以用来复习一下一些之前的简单的知识点&#xff0c;至于思路的话我相信应该都是有的。 这里就不发运…

uci数据集_数据分析找不到数据集?快来看这个盘点

前言数据集相对于机器学习而言是至关重要的&#xff0c;可以说好的数据集是成功的一半。但是&#xff0c;我们很难找到一个特定的数据集来解决各种机器学习问题&#xff0c;甚至是进行实验。因而找到合适的数据集是一件很难的事情&#xff0c;接下来我们就盘点一下一些优质的数…

git保留两个repo的commit并进行合并

以往的合并时首先要删除repo的.git文件夹&#xff0c;然后重新add-commit-push。带来的问题是会丢失某一个仓库的提交信息&#xff0c;不利于时光倒退。经过摸索终于实现了保留两个仓库提交信息的合并方法。介绍如下&#xff1a; 比如要将DownloadPicsBySeleniumAndPhantomJS这…

安利一款编辑神器——Markdown

经常使用word或者那些浏览器自带编辑器的你可能会和我有时候遇到一样的烦恼&#xff0c;调整格式可真是不容易&#xff0c;如果你也有同样的烦恼&#xff0c;不妨可以试一下Markdown&#xff0c;值得你拥有哈。 Markdown的使用 1.安装使用篇 a.首先安装软件&#xff0c;然后创…

python对图片颜色校正_使用Python PIL更改图像色调

Using Python PIL, Im trying to adjust the hue of a given image.Im not very comfortable with the jargon of graphics, so what I mean by “adjusting hue” is doing the Photoshop operation called “Hue/saturation”: this is to change the color of the image uni…

自动生成业务单据流水号方案

我们在开发管理软件的时候,常常遇到流水号(单据号、登记号)自动生成、控制和管理的问题。由于流水号具有唯一性和连续性的特点,在实际开发过程中若处理不好,会产生流水号重复及断号的问题。特别是多个并发用户同时保存一张同样的业务单据时&#xff0c;系统会返回多个相同的流水…

IDEA快捷键的使用成就手速之旅(要想手速变得快,快捷练习必须刚)

IDEA快捷键的使用 &#xff08;持续更新&#xff09; 1.必备合集 a.Ctrl CtrlF 文本代码查找神器呀简直CrtlR 文本代码替换CtrlZ 撤销&#xff08;基操基操&#xff09;CtrlY 删除当前行或者选中行 b.Shirt c.CtrlShirt d.Ctrlalt e.altShirt f.CtrlShirtalt 2.慢慢积…

一个项目部署多个节点会导致锁失效么_Redis分布式锁

分布式锁在很多场景中是非常有用的原语&#xff0c; 不同的进程必须以独占资源的方式实现资源共享就是一个典型的例子。有很多分布式锁的库和描述怎么实现分布式锁管理器(DLM)的博客,但是每个库的实现方式都不太一样&#xff0c;很多库的实现方式为了简单降低了可靠性&#xff…

GIT_服务器与本地环境构建

linux安装git包 很多yum源上自动安装的git版本为1.7&#xff0c;这里手动编译重新安装1&#xff1a;安装依赖包yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker2&#xff1a;删除已有的gityum remove git3&#xff1a…

Maven项目的基本创建步骤

先来个自己笔记的图片备忘一下&#xff0c;如果以后有时间再慢慢更新详细。

visualvm远程监控jvm_大型企业JVM实战:优化及面试热点分析

本次课程的笔记非常多&#xff0c;而且内容已经整理了好几个小时了&#xff0c;接着下来内容也会更多&#xff0c;也是大型企业JVM性能调优实战的最后一节&#xff0c;希望对你有帮助&#xff01;04&#xff1a;JVM性能监控与故障处理工具 大型企业JVM性能调优实战之总结17&…

Markdown图片路径的改变方法

Markdown图片路径的改变方法 Markdown用时一时爽&#xff0c;路径一改火葬场 Markdown在占用内存少的优点的同时&#xff0c;也注定了图片的存储不会是占用内存&#xff0c;而是根据路径和链接链到md文件里的。 相信有不少人会像我一样在做完一个Markdown笔记后&#xff0c;在…

SROP

title: SROP date: 2018-02-21 19:58:12 categories: 栈溢出 tags: - CTF - PWN - 栈溢出 SROP全称为 Sigreturn Oriented Programming &#xff0c;表明利用sigreturn这个函数实现ROP的技术。 参考资料 http://www.freebuf.com/articles/network/87447.htmlhttp://bobao.360.c…

python字符串的方法和列表的方法_Python学习笔记字符串操作之join()和split()方法,列表转字符串,字符串转列表...

随笔记录方便自己和同路人查阅。#------------------------------------------------我是可耻的分割线-------------------------------------------如果有一个字符串列表&#xff0c;需要将它们连接起来&#xff0c;成为一个单独的字符串&#xff0c;join()方法就很有用。join…

变量的比较之equals 与 == 的区别

Java的数据类型分为两种 1.基本数据类型&#xff0c;byte,short,char,int,long,float,double,boolean&#xff0c;只要使用运算符就可以了&#xff0c;进行比较只是简单进行比较其中的字节组合。 两个引用变量是否引用到堆上的同一个对象&#xff0c;也可以使用。 2.复杂的对象…

scheduledthreadpoolexecutor使用_ScheduledThreadPoolExecutor详解

本文主要分为两个部分&#xff0c;第一部分首先会对ScheduledThreadPoolExecutor进行简单的介绍&#xff0c;并且会介绍其主要API的使用方式&#xff0c;然后介绍了其使用时的注意点&#xff0c;第二部分则主要对ScheduledThreadPoolExecutor的实现细节进行介绍。1. 使用简介Sc…

SpringContextHolder 静态持有SpringContext的引用

SpringContextHolder 静态持有SpringContext的引用 package com.test.quartz;import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware;/**** 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何…