函数模块的导入

函数模块的导入

模块好处

  1. 提高可维护性
  2. 可重复使用
  3. 避免函数名和变量名冲突

模块分为三种:

  1. 内置标准模块(又称标准库)
  2. 第三方开源模块,通过pip install 联网安装
  3. 自定义模块

help('modules')可以看到有哪些模块
包含了内置模块和第三方安装的模块,带下划线的是C模块,不用看

import module  #导入整个模块
from module.xx.xx import xx  #导入模块中的某个子集,支持子集嵌套
from module.xx.xx import xx as rename  #当导入模块名字很长,可以简写为另一个名字

模块一旦被调用,相当于执行了另外一个py文件里的代码

导入模块时是根据那个路径作为基准来进行的呢?即:sys.path

import sys
print sys.path

默认是本地当前文件夹,加上一堆默认文件夹
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append('路径') 添加

\site-packages 这个是最后一个路径,一般常用库和第三方库都安装在这里

豆瓣和博客园有国外的镜像
pip3 install -i http://pypi.douban.com/simple/同国外名字后缀

pip3 install -i http://pypi.douban.com/simple/paramiko --trusted-host pypi.douban.com
上面这个是一整行,不是分成两行
paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作

import paramiko

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.108', 22, 'alex', '123') #登陆的地址,端口,帐号密码
stdin, stdout, stderr = ssh.exec_command('df')  #登陆后输入的指令
print (stdout.read())  #读取输入指令后的信息,打印
ssh.close();

paramiko SSH 模块简单应用。
目的:需要ssh链接到Linux主机,执行telnet 命令,抓回显匹配制定内容。
ssh --->执行telnet到本地端口--->执行类似 ls 的命令。匹配命令执行后的特定回显字段。
官方文档地址:http://docs.paramiko.org/en/2.0/api/client.html
准备:pip install paramiko 模块。

import paramiko
ssh = paramiko.SSHClient() #创建sshclient
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #目的是接受不在本地Known_host文件下的主机。
ssh.connect(ip,port,username,passwd) #connect 函数可以接受很多参数,本例只列举4个主要的其他参数请见文档。
stdin,stdout,stderr = ssh.exec_command(cmd,bufsize,timeout) #exec_command参数使用只需要执行一次的命令,因为执行完该命令以后,shell会自动回到ssh初始连接的shell状态下,(表达不好,可以看官方文档。),stdin,out,err,对应shell下的标准输入,输出和错误。
stdin.write('y'+'\n') #这样通过标准输入输入命令
print stdout.read() #输出标准输出。
exec_command(command, bufsize=-1, timeout=None, get_pty=False)
#Execute a command on the SSH server. A new Channel is opened and the requested command is executed. The command’s input and output streams are returned as Python file-like objects representing stdin, stdout, and stderr.在SSH server上执行命令,打开新的channel并执行命令,该命令返回的input,output数据流都是file-like对象。可以使用read,readline,readlines方法来将file-like数据变成string类型。
chan = ssh.invoke_shell() #在SSH server端创建一个交互式的shell,且可以按自己的需求配置伪终端,可以在invoke_shell()函数中添加参数配置。
chan.send(cmd+'\n') #利用send函数发送cmd到SSH server,添加'\n'做回车来执行shell命令。注意不同的情况,如果执行完telnet命令后,telnet的换行符是\r\n
chan.recv(bufsize) #通过recv函数获取回显。

这样基本的函数与方法已经具备了,需要如何定制,就自己写个函数就可以了。
Wish U like,Have Fun。

windows安装第三方模块

下载合适的文件,如果是exe结尾的,直接运行
如果是whl接诶的,打开cmd,将其复制到cmd所在文件夹中,使用pip来运行
在cmd里运行
python -m pip install --user paramiko-2.0.1-py2.py3-none-any.whl

包导入

在目录下增加一个__init__.py的空文件,就会把这个目录初始化为包
然后就可以用
from 文件夹名字 import 文件名
这种方式来导入了

文件夹被Python解释器视作包,需要满足两个条件
1.文件夹中必须有__init__.py文件,该文件可以为空,但必须要有
2.不能作为顶层模块来执行该文件夹中的py文件,即不能作为主函数的入口,就是主函数不能与__init__.py同级

  1. manage 是主程序,需要运行的程序
  2. setting和views的内容见截图
  3. 在manage里面 from crm import views,是因为crm文件夹与manage同级别
  4. 在views 里面可以进行from proj import settings 是因为主程序是manage,从manage的角度来看,proj文件夹与manage是同级别
    原先的理解是,views级别比proj低,导入应该报错,但是因为主程序入口是manage,所以不会报错,如果入口是views就会报错,假如需要通过运行views来导入呢,就是跨模块导入了

跨模块导入

假如目录结构是
├── __init__.py
├── crm
│ ├──__init.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ ├── views.py
├── manage.py #主程序入口
└── proj
├── __init
.py
├── settings.py
├── urls.py
└── wsgi.py

根据上面的结构,如何实现在crm/views.py里导入proj/settings.py模块?
直接执行views.py进行导入的话,会报错,说找到不模块
答案是添加环境变量,把父亲级的路径添加到sys.path中,就可以了,这样导入 就相当于从父亲级开始找模块了。

此时,执行views.py就能用了,但是路径有问题,放其他机器就无法使用了
导入的路径,尽量不要用绝对路径,要规范化,无论哪种操作系统都能通用
那么如何规范呢,动态识别当前路径
views.py修改为

import sys ,os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
print(BASE_DIR)
sys.path.append(BASE_DIR)  
from proj import settings

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

print(settings.DATABASES)

这样直接执行views.py,就能导入settings了

分析

print(dir()) #会看到里面多了一个路径 __file__
print(__file__) #pycharm打印的就是程序的当前绝对路径,但是不在pycharm里面运行的时候,展示的是当前的相对路径,就是/crm 。如果获得了绝对路径,往上找两层就能拿到动态当前路径了,
os.path.dirname(__file__) 获取目录名,认为最后一个是文件
得到
C:/python_work/package/my_proj/crm/
因此执行两次,就剥掉两层了,然后再添加到路径变量里面
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)
from proj import settings  #这样就能从当前views所在的目录里面,跨目录到proj文件夹导入setting文件了
但是以上这样做有个问题,在Python程序里面运行的时候,__file__只得到当前的相对路径,使用pycharm运行的时候会展示成绝对路径的样子,但是实际使用python views.py 在cmd命令台运行的时候,是得到__file__的当前的相对路径的
展示绝对路径的真正应该用的代码是os.path.abspath(__file__)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

相对导入

manage做入口
from . import settings #从往上一级的目录中导入
from .. import slviews #从往上两级的目录中导入,注意不要在相对导入中将主函数目录给导入了,会报错
相对导入处理不当会容易出错,项目中不常用
一个点的常用,两个点的几乎不用

猜你喜欢

转载自www.cnblogs.com/welljoy/p/9209500.html
今日推荐