【Python】开发笔记
近日接触了一个python使用socket与阿里云服务器建立通信的项目,开发过程中查阅了很多资料,也总结了python使用过程中自己对开发工具、python语言中的一些心得,为方便展示,也方便自己以后查阅,因此写下此文。
1. 开发工具篇
1)前言
要致富,先修路,在进行开发前,习得一件得心应手的工具是十分必要的。对于年龄22岁,开发经验20年的大佬来说,或许本人的学习总结十分浅显,不过个人希望将自己学习IDE过程中的一些经验分享出来,不积跬步无以至千里。
2)VScode
VScode搭建Python环境 简明教程
-
认识VScode 和我如何使用
- 下载VScode最新版和Python3.7.4(作者常用)
- 安装VScode和Python3.7.4
- 打开VScode商店,下载python扩展(这个组件用于链接Python解释器,起到辅助作用)
- 新建一个
.py
文件,随便写几句话,然后点击debug
,生成默认launch.json
,内容如下
{ // 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。 // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "name": "Python: 当前文件", "type": "python", "request": "launch", "program": "${file}", "console": "integratedTerminal" } ] }
- 在
.vscode
文件夹下新建setting.json
,添加内容如下
{ "python.linting.pylintEnabled": false, "python.linting.flake8Enabled": true, "python.linting.enabled": true, }
- 现在即可运行
.py
文件
-
git及ssh远程开发
-
皮肤推荐
颜色主题推荐:
- Atom One Light
- Github Plus
- One Dark Pro
图标推荐:
- Helium Icon Theme
3)Pycharm
- 认识Pycharm
- pycharm切换内置终端为conda虚拟环境
个人理解:内置终端的Shell
会读取python.exe
文件夹下的文件信息(比如Scripts
),读取python的基本信息(版本、虚拟环境等等),当添加修改解释器python.exe
时便会自动修改对应的Shell
4)Visual Studio
- 认识Visual Studio
- 讲一件兄弟Dve C++
5)Jupyter Lab/Jupyter Notebook
- 认识JL/JN
- 使用它进行简单的环境配置
jupyter修改启动路径需要注意的是 c.NotebookApp.notebook_dir = ‘D:\Users\lenovo\PycharmProjects’ 中的文件夹路径需要是双反斜杠或单正斜杠(window)
6)Anaconda(集成工具)
-
Anaconda 有什么用
Anaconda(官方网站)就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。
如果日常工作或学习并不必要使用1,000多个库,那么可以考虑安装Miniconda(图形界面下载及命令行安装请戳),这里不过多介绍Miniconda的安装及使用。 -
Anaconda、conda、pip、virtualenv的区别
① Anaconda
Anaconda是一个包含180+的科学包及其依赖项的发行版本。其包含的科学包包括:conda, numpy, scipy, ipython notebook等。
② conda
conda是包及其依赖项和环境的管理工具。适用语言:Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, FORTRAN。
适用平台:Windows, macOS, Linux
用途:
快速安装、运行和升级包及其依赖项。
在计算机中便捷地创建、保存、加载和切换环境。
如果你需要的包要求不同版本的Python,你无需切换到不同的环境,因为conda同样是一个环境管理器。仅需要几条命令,你可以创建一个完全独立的环境来运行不同的Python版本,同时继续在你常规的环境中使用你常用的Python版本。——conda官方网站conda为Python项目而创造,但可适用于上述的多种语言。
conda包和环境管理器包含于Anaconda的所有版本当中。
③ pip
pip是用于安装和管理软件包的包管理器。pip编写语言:Python。
Python中默认安装的版本:
Python 2.7.9及后续版本:默认安装,命令为pip
Python 3.4及后续版本:默认安装,命令为pip3
pip名称的由来:pip采用的是递归缩写进行命名的。其名字被普遍认为来源于2处:“Pip installs Packages”(“pip安装包”)
“Pip installs Python”(“pip安装Python”)④ virtualenv
virtualenv:用于创建一个独立的Python环境的工具。解决问题:
当一个程序需要使用Python 2.7版本,而另一个程序需要使用Python 3.6版本,如何同时使用这两个程序?
如果将所有程序都安装在系统下的默认路径,如:/usr/lib/python2.7/site-packages,当不小心升级了本不该升级的程序时,将会对其他的程序造成影响。
如果想要安装程序并在程序运行时对其库或库的版本进行修改,都会导致程序的中断。
在共享主机时,无法在全局site-packages目录中安装包。
virtualenv将会为它自己的安装目录创建一个环境,这并不与其他virtualenv环境共享库;同时也可以选择性地不连接已安装的全局库。
⑤ pip 与 conda 比较
→ 依赖项检查
pip:
不一定会展示所需其他依赖包。
安装包时或许会直接忽略依赖项而安装,仅在结果中提示错误。
conda:
列出所需其他依赖包。
安装包时自动安装其依赖项。
可以便捷地在包的不同版本中自由切换。
→ 环境管理
pip:维护多个环境难度较大。
conda:比较方便地在不同环境之间进行切换,环境管理较为简单。
→ 对系统自带Python的影响
pip:在系统自带Python中包的更新/回退版本/卸载将影响其他程序。
conda:不会影响系统自带Python。
→ 适用语言
pip:仅适用于Python。
conda:适用于Python, R, Ruby, Lua, Scala, Java, JavaScript, C/C++, FORTRAN。
⑥ conda与pip、virtualenv的关系
conda结合了pip和virtualenv的功能。作者:Raxxie
链接:https://www.jianshu.com/p/62f155eb6ac5
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 -
Anaconda(conda)问题解决
-
创建虚拟环境失败
Solving environment: done
问题描述:输入conda create -n myenv python=3.7 pandas jupyter seaborn scikit-learn keras pytorch pillow
创建虚拟环境,但是由于网络/源的问题,导致几个包报HTTP0
的错误,再次执行该语句,仅仅停在Collecting package metadata (repodata.json): done Solving environment: done
,之后便无法创建环境,输入conda info --envs
,显示只有base
环境。
问题解决:输入conda clean --all
,清除之前未完成conda安装的包即可正常创建环境。 -
Anaconda Navigator启动界面卡住,闪退的解决
问题描述:在打开Anaconda Navigator时,启动界面卡住,并闪退。
问题解决:打开anaconda prompt,输入以下代码进行重置conda update anaconda-navigator anaconda-navigator --reset conda update anaconda-client conda update -f anaconda-client anaconda-navigator #命令行启动Navigator
-
2. Python篇
1)个人认为的重点
(1)前言
介绍完开发工具后,相信大家已经建立了属于自己的开发环境。关于这门语言的学习,互联网上关于Python有着许多经典的教程,比如链接: 菜鸟教程,Python的官方开发文档。在学习或者使用之余经常查阅,实在不懂的到csdn、baidu、stackflow、github上查找答案,基本上可以解决99%的问题,所以多做多问还是学习必不可少的一部分(对我个人也是)。
(2)个人总结
【0】杂谈
1. 与C++异同
无编译,面向对象
2. 编码
- ASCII:1B 英文
- GBK:2B 中文
- Unicode:2-4B 万文
- UTF-32\16\8:Unicode Transformation Format
UTF-8:英文1B,欧文2B,东亚文3B
中国windows:GBK
Python:UTF-8 编码
python中指定编码
# coding=utf-8
# -*- coding:utf-8 -*-
# -*- coding=utf-8 -*-
【1】函数
1. 形参中冒号的使用
- 形参中冒号的使用
t1:TreeNode中的冒号“:”是用来限制t1的传入类型def mergeTrees(t1: TreeNode, t2: TreeNode) -> TreeNode:
末尾的 -> 则表示函数最后的返回应该是TreeNode类型的
【2】语法
1. with 管理上下文
-
with 管理上下文
两大主体:
- enter:初始化
- exit:退出
关键作用:简化try….except….finally的处理流程
详细来说:with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等。
with open('d:\\xxx.txt') as fp: print fp.read()
with语句最关键的地方在于被求值对象必须有__enter__()和__exit__()这两个方法,那我们就可以通过自己实现这两方法来自定义with语句处理异常。
查询
opened()
函数的源码class opened(object): def __init__(self,filename): self.handle=open(filename) print "Resource:%s"%filename def __enter__(self): print "[enter%s]: Allocate resource."%self.handle return self.handle#可以返回不同的对象 def __exit__(self,exc_type,exc_value,exc_trackback): print "[Exit %s]: Free resource." %self.handle if exc_trackback is None: print "[Exit %s]:Exited without exception."%self.handle self.handle.close() else: print "[Exit %s]: Exited with exception raised."%self.handle return False # 可以省略,缺省的None也是被看做是False
2. 标识符
下划线:
_function() # 类属性
__function() # 私有成员
__function__() # 构造函数
3. 命令行控制
4. 数据类型
- String:用[]读取;string函数:endwith\ find\ format\ join\ stripe\replace\ partition\maketrans\ split\translate
- List:用[]读取;List函数:append\del\len\ pop\sort\count\ extend
- Tuple:只读
- Dictionary:用{}读取;字典函数
- Set:
5. File & OS
-
FILE:操作文件、文件内容
open\close\write\read\tell\seek\rename\removepython.file
对象-
file.open(file, mode='r', buffering=-1, encoding=None)
关于file.open()
函数的更多参数,请访问Python3 File(文件) 方法 -
file.close()
-
file.flush()
刷新文件内部缓冲,直接将内部缓冲区的数据立刻写入文件,不需等待输出缓冲区写入 -
file.write()
'a'写入字符串; 'wb'写入二进制文本(需要encode());
-
file.read()
-
file.readline()
读取整行 -
file.writelines()
写入字符串列表,换行须自己加入\n
-
file.fileno()
返回文件描述符 -
file.isatty()
是否连接到终端设备 -
file.seek(offset[, whence])
设置文件读取指针,并会影响read()
函数的读取顺序
whence:可选,默认值为 0。给 offset 定义一个参数,表示要从哪个位置开始偏移;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。f = open('workfile', 'rb+') f.write(b'0123456789abcdef') 16 f.seek(5) # 移动到文件的第六个字节 5 f.read(1) b'5' f.seek(-3, 2) # 移动到文件倒数第三个字节 13 f.read(1) b'd'
-
file.tell()
返回文件读取指针的位置 -
file.truncate()
返回截断后的文件程序例程
# 打开文件 fo = open("runoob.txt", "r") print ("文件名为: ", fo.name) for line in fo.readlines(): #依次读取每行 line = line.strip() #去掉每行头尾空白 print ("读取的数据为: %s" % (line)) # 关闭文件 fo.close()
-
-
OS:操作目录、权限、属性
mkdir\chdir\getcwd\rmdir路径的格式规范(LINUX 系统不同)
# 在路径前面加r,即保持字符原始值的意思。 sys.path.append(r'c:\Users\mshacxiang\VScode_project\web_ddt') # 替换为双反斜杠 sys.path.append('c:\\Users\\mshacxiang\\VScode_project\\web_ddt') # 替换为正斜杠 sys.path.append('c:/Users/mshacxiang/VScode_project/web_ddt')
获取指定路径下所有文件的绝对路径
关键函数:
os.walk()
、os.path.join()
、os.path.splitext()
import os def get_file_path_by_name(file_dir): ''' 获取指定路径下所有文件的绝对路径 :param file_dir: :return: ''' L = [] for root, dirs, files in os.walk(file_dir): # 获取所有文件 for file in files: # 遍历所有文件名 if os.path.splitext(file)[1] == '.*': L.append(os.path.join(root, file)) # 拼接处绝对路径并放入列表 print('总文件数目:', len(L)) return L print(get_file_path_by_name(r'D:\vsproject\pyhelloworld\1216'))
关键函数:
os.listdir()
、os.path.isdir()
、os.path.joindir()
import os l = [] def listdir(path, list_name): # 传入存储的list for file in os.listdir(path): file_path = os.path.join(path, file) # 自动迭代子文件夹 if os.path.isdir(file_path): listdir(file_path, list_name) # 将子文件压入列表 else: list_name.append(file_path) return l print(listdir(r'D:\vsproject\pyhelloworld\1216', l))
相对路径的操作
关键函数:
os.getcwd()
、string.rstrip()
、os.chdir()
、os.path.isfile
import os print(os.getcwd()) # 结果 # D:\vsproject\pyhelloworld print(os.getcwd()) os.chdir(r'D:\vsproject\pyhelloworld\1216') print(os.getcwd()) # D:\vsproject\pyhelloworld # D:\vsproject\pyhelloworld\1216
import os l = [] def lookfile(PATH, l): file = os.listdir(PATH) #获取路径下文件夹和文件 # print(file) for i in file: ret=os.path.join(PATH, i) if os.path.isdir(ret): print(i) lookfile(ret, l) elif os.path.isfile(ret): l.append(ret) return l os.chdir(r'D:\vsproject\pyhelloworld\DataBase') for listname in lookfile(os.getcwd(), l): print(listname) """ 结果 D:\vsproject\pyhelloworld\DataBase\demo_create_tabel.py D:\vsproject\pyhelloworld\DataBase\demo_mysql_order.py D:\vsproject\pyhelloworld\DataBase\demo_mysql_test.py D:\vsproject\pyhelloworld\DataBase\demo_mysql_work.py D:\vsproject\pyhelloworld\DataBase\demo_mywork.py D:\vsproject\pyhelloworld\DataBase\demo_pymysql_test.py D:\vsproject\pyhelloworld\DataBase\Server_mysql_pic.py D:\vsproject\pyhelloworld\DataBase\tempCodeRunnerFile.py """
分离扩展名
import os print(os.path.exists(os.getcwd())) print(os.path.isabs(os.getcwd())) # 是否绝对路径 print(os.path.split(os.getcwd())) print(os.path.splitext(os.getcwd())) # 分离扩展名 filename = r"D:\vsproject\pyhelloworld\DataBase\demo_create_tabel.py" print(os.path.dirname(filename)) # 获取路径名 print(os.path.basename(filename)) # 获取文件名 print(os.path.getsize(filename)) # 获取文件大小 """ 结果 True True ('D:\\vsproject', 'pyhelloworld') ('D:\\vsproject\\pyhelloworld', '') D:\vsproject\pyhelloworld\DataBase demo_create_tabel.py 784 """
对一个文件下,所有文件,重命名,去取文件命中指定字符
# -*- coding: utf-8 -*- """ 对一个文件下,所有文件,重命名,去取文件命中指定字符 """ import os in_path0='F:\\迅雷下载' in_dirtyStr=['阳光电影www.ygdy8.com.','.BD.720p','语中字'] #需要清理的字符 os.chdir(in_path0) print(os.getcwd()) #======== list0 = os.listdir() for line in list0: if os.path.isfile(line): line0 = str(line) # 去除指定字符 for i in in_dirtyStr: line = line.replace(i,'') print(line0,line) os.rename(line0,line)
os.linesep字符串给出当前平台使用的行终止符
if __name__ == '__main__': wd=os.getcwd() filetest = open (wd+'/lw/waston.txt', 'r+',encoding='utf-8') print(filetest.read()) # 不用\n 如果使用os.linesep filetest.write ("\n") while 1: newline = input("Enter a line word(',' to quit):") if newline != ",": filetest.write ('%s%s' % (newline, os.linesep)) else: break filetest.close ()
未完成
# 运行shell命令: os.system() # 读取和设置环境变量: os.getenv() os.putenv() # 给出当前平台使用的行终止符: os.linesep() # 创建多级目录: os.makedirs(r“c:\python\test”) # 创建单个目录: os.mkdir(“test”) # 获取文件属性: os.stat(file) # 修改文件权限与时间戳: os.chmod(file)
6. DATE
时间
import time
import calendar
ticks = time.time()
print ("当前时间戳为:", ticks)
# 获取当前时间
localtime = time.localtime(time.time())
print ("本地时间为 :", localtime)
# 获取格式化的时间
localtime = time.asctime( time.localtime(time.time()) )
print ("本地时间为 :", localtime)
# 格式化成2016-03-20 11:45:39形式
print (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
# 格式化成Sat Mar 28 22:24:24 2016形式
print (time.strftime("%a %b %d %H:%M:%S %Y", time.localtime()))
# 将格式字符串转换为时间戳
a = "Sat Mar 28 22:24:24 2016"
print (time.mktime(time.strptime(a,"%a %b %d %H:%M:%S %Y")))
"""
当前时间戳为: 1608728612.9450793
本地时间为 : time.struct_time(tm_year=2020, tm_mon=12, tm_mday=23, tm_hour=21, tm_min=3, tm_sec=32, tm_wday=2, tm_yday=358, tm_isdst=0)
本地时间为 : Wed Dec 23 21:03:32 2020
2020-12-23 21:03:32
2020-12-23 21:03:32
Wed Dec 23 21:03:32 2020
1459175064.0
"""
日历
import calendar
cal = calendar.month(2020, 12)
print ("以下输出2020年12月份的日历:")
print (cal)
perf_counter 进度条实例
import time
scale = 50
print("执行开始".center(scale//2,"-")) # .center() 控制输出的样式,宽度为 25//2,即 22,汉字居中,两侧填充 -
start = time.perf_counter() # 调用一次 perf_counter(),从计算机系统里随机选一个时间点A,计算其距离当前时间点B1有多少秒。当第二次调用该函数时,默认从第一次调用的时间点A算起,距离当前时间点B2有多少秒。两个函数取差,即实现从时间点B1到B2的计时功能。
for i in range(scale+1):
a = '*' * i # i 个长度的 * 符号
b = '.' * (scale-i) # scale-i) 个长度的 . 符号。符号 * 和 . 总长度为50
c = (i/scale)*100 # 显示当前进度,百分之多少
dur = time.perf_counter() - start # 计时,计算进度条走到某一百分比的用时
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(c,a,b,dur),end='') # \r用来在每次输出完成后,将光标移至行首,这样保证进度条始终在同一行输出,即在一行不断刷新的效果;{:^3.0f},输出格式为居中,占3位,小数点后0位,浮点型数,对应输出的数为c;{},对应输出的数为a;{},对应输出的数为b;{:.2f},输出有两位小数的浮点数,对应输出的数为dur;end='',用来保证不换行,不加这句默认换行。
time.sleep(0.1) # 在输出下一个百分之几的进度前,停止0.1秒
print("\n"+"执行结果".center(scale//2,'-'))
综合例程
import time
import calendar
"""
时间元组(年、月、日、时、分、秒、一周的第几日、一年的第几日、夏令时)
一周的第几日: 0-6
一年的第几日: 1-366
夏令时: -1, 0, 1
"""
"""
python中时间日期格式化符号:
------------------------------------
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称 # 乱码
%% %号本身
"""
# (1)当前时间戳
# 1538271871.226226
time.time()
# (2)时间戳 → 时间元组,默认为当前时间
# time.struct_time(tm_year=2018, tm_mon=9, tm_mday=3, tm_hour=9, tm_min=4, tm_sec=1, tm_wday=6, tm_yday=246, tm_isdst=0)
time.localtime()
time.localtime(1538271871.226226)
# (3)时间戳 → 可视化时间
# time.ctime(时间戳),默认为当前时间
time.ctime(1538271871.226226)
# (4)时间元组 → 时间戳
# 1538271871
time.mktime((2018, 9, 30, 9, 44, 31, 6, 273, 0))
# (5)时间元组 → 可视化时间
# time.asctime(时间元组),默认为当前时间
time.asctime()
time.asctime((2018, 9, 30, 9, 44, 31, 6, 273, 0))
time.asctime(time.localtime(1538271871.226226))
# (6)时间元组 → 可视化时间(定制)
# time.strftime(要转换成的格式,时间元组)
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# (7)可视化时间(定制) → 时间元祖
# time.strptime(时间字符串,时间格式)
print(time.strptime('2018-9-30 11:32:23', '%Y-%m-%d %H:%M:%S'))
# (8)浮点数秒数,用于衡量不同程序的耗时,前后两次调用的时间差
time.clock()
时间命名文件名
import os
import time
import datetime
rootDir = "I:/1/"
dic={}
for dirName,subDirs,fileList in os.walk(rootDir):
print(dirName)
for fn in fileList:
fnpath=dirName+fn
st = os.stat(fnpath)
mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime = st
# print mtime
t=time.ctime(mtime)
d_from_t = datetime.datetime.fromtimestamp(mtime)
dic[fnpath]=d_from_t.strftime('%Y-%m-%d%H:%M:%S')
# print fnpath+"- last modified:", d_from_t.strftime('%Y-%m-%d %H:%M:%S')
pass
for x in dic:
# p=os.path.splitext(x)[0]
p=os.path.dirname(os.path.abspath(x))
ext=os.path.splitext(x)[1]
# tpath=p+"/"+dic[x]+ext
# print tpath
# print os.path.dirname(os.path.abspath(p))
nname=os.path.join(rootDir,dic[x]+ext)
# print p,ext
print("os.rename('"+x+"','"+nname+"'')")
os.rename(x,nname)
pass
按文件存取时间顺序列出目录
import os
DIR = "/home/serho/workspace/lisp"
def compare(x, y):
stat_x = os.stat(DIR + "/" + x)
stat_y = os.stat(DIR + "/" + y)
if stat_x.st_ctime < stat_y.st_ctime:
return -1
elif stat_x.st_ctime > stat_y.st_ctime:
return 1
else:
return 0
iterms = os.listdir(DIR)
iterms.sort(compare)
for iterm in iterms:
print(iterm)
7. 异常处理
三个结构:
- try…except…
- try…finally…
- raise 触发异常
(3)数据挖掘
【1】爬虫
多线程爬虫
# coding: utf-8
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
import json
from requests import adapters
from proxy import get_proxies
headers = {
"Host": "splcgk.court.gov.cn",
"Origin": "https://splcgk.court.gov.cn",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
"Referer": "https://splcgk.court.gov.cn/gzfwww/ktgg",
}
url = "https://splcgk.court.gov.cn/gzfwww/ktgglist?pageNo=1"
def spider(page):
data = {
"bt": "",
"fydw": "",
"pageNum": page,
}
for _ in range(5):
try:
response = requests.post(url, headers=headers, data=data, proxies=get_proxies())
json_data = response.json()
except (json.JSONDecodeError, adapters.SSLError):
continue
else:
break
else:
return {}
return json_data
def main():
with ThreadPoolExecutor(max_workers=8) as t:
obj_list = []
begin = time.time()
for page in range(1, 15):
obj = t.submit(spider, page)
obj_list.append(obj)
for future in as_completed(obj_list):
data = future.result()
print(data)
print('*' * 50)
times = time.time() - begin
print(times)
if __name__ == "__main__":
main()
将多线程函数改成单线程函数
def single():
begin = time.time()
for page in range(1, 15):
data = spider(page)
print(data)
print('*' * 50)
times = time.time() - begin
print(times)
if __name__ == "__main__":
single()
python线程池 ThreadPoolExecutor 的用法及实战
(4)原理解析
【1】python 执行
众所周知,python对程序的执行可通过以下两种方式:
- IDE
- Shell
对于Shell执行,我们需要注意所执行.py
文件是否包含在sys.path
下:
python example.py
对于python包
而言,不能照搬上述的使用方法,正确的调用语句如下:
python -m example_pkgs
3. 服务器部署篇
1)ubuntu系统部署
(1)系统安装
等到有新的电脑了自己新装一下,然后记录安装过程。
(2)问题解决
参考作者博客:【Linux鸟哥笔记】20-启动流程、模块管理与Loader
2)linux系统自学
参考作者博客:Ubuntu16.04 使用心得