源源不断立异【ca88会员登录中心】,Python常用模块

ca88会员登录中心 32
ca88会员登录中心

壹、在动用requests发送请求,响应数据转成json提醒,未有可解码的json

Time 模块

时光模块常用的有如下三种。

import time
print(time.time())  # 1513319911.3789327 1970年到当前的总时间s。
print(time.strftime('%Y-%m-%d %X')) # 2017-12-15 14:38:31

元组情势显得时间:

print(time.localtime())
# time.struct_time(tm_year=2017, tm_mon=12, tm_mday=15, tm_hour=14, tm_min=53, tm_sec=39, tm_wday=4, tm_yday=349, tm_isdst=0)

print(time.localtime().tm_mon) # 12

UTC时间:

print(time.gmtime())

将格式化的大运转移为元组方式的小运:

print(time.localtime(3243543544))
print(time.gmtime(3243543544))

岁月转移:

print(time.ctime(12334454))
print(time.asctime(time.gmtime()))

Sun May 24 02:14:14 1970
Fri Dec 15 07:38:07 2017

简介:

模块:用一坨代码落成了有个别成效的代码集结。分为二种:

  • 自定义模块
  • 其3方模块
  • 内置模块

消除办法:

random模块

import random

print(random.random())#(0,1)----float    大于0且小于1之间的小数

print(random.randint(1,3))  #[1,3]    大于等于1且小于等于3之间的整数

print(random.randrange(1,3)) #[1,3)    大于等于1且小于3之间的整数

print(random.choice([1,'23',[4,5]]))# 1或者23或者[4,5] 随机选取

print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合

print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 


item=[1,3,5,7,9]
random.shuffle(item) #打乱item的顺序,相当于"洗牌"
print(item)

更改随机验证码:

import random
def make_code(n):
    res=''
    for i in range(n):
        s1=chr(random.randint(65,90))
        s2=str(random.randint(0,9))
        res+=random.choice([s1,s2])
    return res

print(make_code(4))

python去找模块的渠道

ca88会员登录中心 1

内部,第3方模块安装的职位

ca88会员登录中心 2

晋升:第1方模块名不可能和放手以及第一方模块重名

导入模块:from lib.account import login

 

那是由于,发送请求的数据,存在指鹿为马,响应出错举例404
400,所以找不到能够解码的json

os模块常用函数

os.getcwd() 获取当前专门的学问目录,即目前python脚本职业的目录路线
os.chdir(“dirname”) 更动近期剧本职业目录;相当于shell下cd
os.curdir 再次回到当前目录: (‘.’)
os.pardir 获取当前目录的父目录字符串名:(‘..’)
os.makedirs(‘dirname1/dirname二’) 可生成多层递归目录
os.removedirs(‘dirname一’)
若目录为空,则删除,并递归到上一流目录,固然也为空,则删除,就那样推算
os.mkdir(‘dirname’) 生成单级目录;也正是shell中mkdir dirname
os.rmdir(‘dirname’)
删除单级空目录,若目录不为空则相当小概删除,报错;约等于shell中rmdir
dirname
os.listdir(‘dirname’)
列出钦赐目录下的保有文件和子目录,包含隐形文件,并以列表方式打字与印刷
os.remove() 删除四个文书
os.rename(“oldname”,”newname”) 重命名文件/目录
os.stat(‘path/filename’) 获取文件/目录音信
os.sep 输出操作系统特定的路子分隔符,win下为”\”,Linux下为”/”
os.linesep 输出当前平台选取的行终止符,win下为”\t\n”,Linux下为”\n”
os.pathsep 输出用于私分文件路线的字符串 win下为;,Linux下为:
os.name 输出字符串提醒当前接纳平台。win->’nt’; Linux->’posix’
os.system(“bash command”) 运维shell命令,直接彰显
os.environ 获取系统情状变量
os.path.abspath(path) 重返path规范化的相对路径
os.path.split(path) 将path分割成目录和文书名贰元组再次来到
os.path.dirname(path)
重回path的目录。其实正是os.path.split(path)的第多个成分
os.path.basename(path)
再次回到path最后的文本名。如何path以/或\最终,那么就会回来空值。即os.path.split(path)的第二个因素
os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False
os.path.isabs(path) 借使path是相对路线,重临True
os.path.isfile(path) 要是path是三个设有的文件,重临True。不然重返False
os.path.isdir(path)
假使path是1个存在的目录,则赶回True。不然重返False
os.path.join(path1[, path2[, …]])
将三个路子组合后归来,第3个绝对路线从前的参数将被忽视
os.path.getatime(path) 重临path所指向的公文恐怕目录的尾声存取时间
os.path.getmtime(path) 再次回到path所指向的文本或许目录的终极修改时间
os.path.getsize(path) 返回path的大小

os.path.normcase()此函数在Linux和mac平台上,该函数会原样重返path,在windows平台上会将路径中的全部字符转换为小写的花样,并将斜调换为反斜杠:

# Linux 平台:
>>> import os
>>> os.path.normcase('c:/windows\\system32\\')
'c:/windows\\system32\\'

# Windows平台:
>>> import os
>>> os.path.normcase('c:/windows\\system32\\')
'c:\\windows\\system32\\'

使用.. 能够代表上一流目录。对目录进行格式化:

#Windows 平台:
>>> os.path.normpath('c://windows\\System\\../Temp/')
'c:\\windows\\Temp'

# Linux 平台:
>>> os.path.normpath('/etc/system/sysconfig/\\\\network/\\\ifconfig/../..')
'/etc/system/sysconfig'

得到文件目录的二种艺术(有多少层,就采纳多少次os.path.dirname):

方式一:
>>> os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath('/etc/sysconfig/network-scripts/ifcfg-eth0'))))
'/etc'

方式二: os.pardir想当与  ..    sys.path是一个目录列表.使用insert(0,..)的方式可以优先将目录加入到列表的最前面.
>>> topdir = os.path.normpath(os.path.join(os.path.abspath('/etc/sysconfig/network-scripts/ifcfg-eth0'),os.pardir,os.pardir,os.pardir))
>>> print(topdir)
/etc
>>> sys.path.insert(0,topdir)

添加sys.path路径:

ca88会员登录中心 3

 

演示如下:

sys模块

sys.argv 命令行参数List,第两个要素是先后本人路径
sys.exit(n) 退出程序,符合规律退出时exit(0)
sys.version 获取Python解释程序的版本音信
sys.maxint 最大的Int值
sys.path 再次回到模块的寻觅路线,开首化时利用PYTHONPATH情状变量的值
sys.platform 再次来到操作系统平台名称

打印进程条的演示:

>>> print('[%-20s]' %'##')
[##                  ]
# -20 表示宽度,[%-20s]是固定写法,后面引用字符变量 %'##'

'\r' 表示跳到行首打印

#=========实现打印进度条函数==========
import sys
import time

def progress(percent,width=50):
    if percent >= 1:
        percent=1
    show_str=('[%%-%ds]' %width) %(int(width*percent)*'#')
    print('\r%s %d%%' %(show_str,int(100*percent)),file=sys.stdout,flush=True,end='')

os模块(和种类相关)

os.stat(“path“)  获取文件目录消息

ca88会员登录中心 4

os.path.dirname(path)  获取文件所在的目录

ca88会员登录中心 5

os.path.exists(path)  假如path存在则赶回true,不然重返false

ca88会员登录中心 6

os.path.join(path1[,path2[,…]])  将五个门路组合后回来,第四个相对路线在此以前的参数将被忽略

ca88会员登录中心 7

 

postdata = '''{'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}'''
url = 'https://secure.elong.com/passport/ajax/elongLogin'
response = Session().post(url,data=postdata)
print(response.json())

shutil 模块

shutil模块重借使对文件,文件夹,和压缩包进行操作管理的模块,也正是系统中常用的文本操作命令。
shutil.copyfileobj(fsrc, fdst[, length])
:复制文件,假使指标文件存在,则覆盖目标文件。

import shutil
shutil.copyfileobj(open('old.xml', 'r'), open('new.xml', 'w'))

shutil.copyfile(src, dst) 拷贝文件。

shutil.copyfile('new.xml', 'f2.log')

shutil.copymode(src, dst)
仅拷贝权限。文件的剧情,所属用户和所属组都不改变。
shutil.copystat(src, dst) 仅拷贝状态音讯,包含: mode
bits,atime,mtime,flages.
shutil.copy(src,dst) : 拷贝文件和权限。

shutil.copy('f2.log','f1.log')

shutil.copy2(src, dst) 拷贝文件和景观音讯

shutil.copy2('f1.log', 'f2.log')

shutil.copytree(src, dst, symlinks=False, ignore=None)
递归的正片文件目录,和shutil.ignore_patterns(*patterns)连用,排除不需求拷贝的剧情:

shutil.copytree('folder1', 'folder2', ignore=shutil.ignore_patterns('*.pyc', 'tmp*')) 
#目标目录不能存在,注意对folder2目录父级目录要有可写权限,ignore的意思是排除 

拷贝软连接:

import shutil

shutil.copytree('f1', 'f2', symlinks=True, ignore=shutil.ignore_patterns('*.pyc', 'tmp*'))
# 通常的拷贝都把软连接拷贝成硬链接,即对待软连接来说,创建新的文件

shutil.rmtree(path[, ignore_errors[, onerror]])递归的去除文件。

shutil.rmtree('folder1')

shutil.move(src, dst)递归的去运动文件,它如同mv 命令,其实就是重命名。

shutil.move('folder1', 'folder3')

shutil.make_archive(base_name, format,...)
创设压缩包,并重回文件路线,如 zip,tar。

  • base_name:压缩包的文本名,也得以是压缩包的不二诀要。只是文件名时,则保留当前至当前目录,不然保存至钦定路径。如
    data_bak =>保存至近日路。如:/tmp/data_bak =>保存至/tmp/
  • format:压缩包体系,“zip”, “tar”, “bztar”,“gztar”
  • root_dir:要削减的文本夹路线(暗许当前目录)
  • owner:用户,暗许当前用户
  • group: 组,暗许当前组
  • logger:用于记录日志,平时是logging.Logger对象

示例:

#将 /data 下的文件打包放置当前程序目录
import shutil
ret = shutil.make_archive("data_bak", 'gztar', root_dir='/data')

#将 /data下的文件打包放置 /tmp/目录
import shutil
ret = shutil.make_archive("/tmp/data_bak", 'gztar', root_dir='/data') 

shutil 对压缩包的管理是调用 ZipFile 和 TarFile 多少个模块来张开的.

 hashlib模块:  (加密有关操作)

用户名,密码保存的时候必须加密

md伍加密是不得以反解的。

ca88会员登录中心 8

因为每种计算机上的md5加密出来的数额都以一模一样的,所以会被人家获得加密对应的用户名,密码。所以要和煦再定制,使md伍加密出来的数据只设有自身的微管理器上。

ca88会员登录中心 9

加秘密报告到注册实例:

ca88会员登录中心 10

 

 ca88会员登录中心 11

 

其实从图上很明显能看到难题,因为postdata是字符串类型,不是dict字典

json&pickle模块

把对象(变量)从内部存款和储蓄器中成为可存款和储蓄或传输的历程称之为系列化,在Python中叫pickling.

  • json:
    json援助具备通用项目标操作,对于python特有的成效不接济,就有很好的跨平台性。
    在采纳eval实行字符串表明式是有局限性的,对于常见的数据类型,json.loads和eval都能用,但碰着特殊类型的时候,eval就随意用了,所以eval的要害照旧常常用来施行3个字符串表明式,并回到表达式的值。
    动用json.dump()可以将字典函数等类型调换为字符串类型,方便存款和储蓄:

import  json
dic = {'name': 'alvin', 'age': 23, 'sex': 'male'}
print(type(dic))

j=json.dumps(dic)
print(type(j))
print(j)

输出:
<class ‘dict’>
<class ‘str’>
{“name”: “alvin”, “age”: 23, “sex”: “male”}

利用json.loads()情势能够将符合json格式的多少开始展览体系化:

# 读取json.txt的文件内容为:{"name": "alvin", "age": 23, "sex": "male"}
import  json
with open('json.txt','r') as f2:
    data=json.loads(f2.read())
    print(type(data))
    print(data)

输出:
<class ‘dict’>
{‘name’: ‘alvin’, ‘age’: 23, ‘sex’: ‘male’}

  • pickle: 是python
    特有体系化操作,能够类别化函数等分外类别。与json的选拔格局接近。

import pickle
def func():
    print('this is func')    
j=pickle.dumps(func)
print(j)

出口的是bytes类型:
b’\x80\x03c__main__\nfunc\nq\x00.’

反系列化:

import pickle
f=open('序列化对象_pickle','rb')
data=pickle.loads(f.read())  #  等价于data=pickle.load(f)
print(data['age'])   

嵌入的模块

ca88会员登录中心 12

__doc__   是py文件的申明

ca88会员登录中心 13

__file__  #文本本人的门路

ca88会员登录中心 14

__package__  当前py文件在哪个文件夹下,假若多少个门路用.连接

__cached__  做缓存用的

__name__  (重要)

__name__ == ‘__main__’的应用:

主文件: 调用函数前,必须加__name__ == ‘__main__’

 

json类别化  (Json正是字符串)

json.loads  用于将列表、字典、元组情势的字符串,调换为相应的字典,列表,元组(注意报错,格式)

ca88会员登录中心 15

ca88会员登录中心 16

只顾上海体育场地的格式,报错。

json.dumps()  将得到的字典、列表,元组调换为对应的字符串

ca88会员登录中心 17

json.dump()  获得内容再写入相应的文本内

 

如上海教室代码假设实施报如下错误:

shelve模块

shelve模块和pickle作用周围,不过比pickle模块轻巧,唯有二个open函数,重回类似字典的靶子,可读可写;key必须为字符串,而值能够是python所支撑的数据类型。

import shelve

f=shelve.open(r'sheve.txt')
# f['stu1_info']={'name':'egon','age':18,'hobby':['piao','smoking','drinking']}
# f['stu2_info']={'name':'gangdan','age':53}
# f['school_info']={'website':'http://www.pypy.org','city':'beijing'}

print(f['stu1_info']['hobby'])
f.close()

configparser模块:  (展开,读取特定格式的文本)(私下认可文件都以字符串)

ca88会员登录中心 18

 

 ca88会员登录中心 19

 

ca88会员登录中心 20

xml模块

xml是先后之间展开数据交互的协议,在稍微应用中还会动用XML协议。xml和json类似,也是跨平台,xml协议在逐一语言中都以永葆的。
xml文件是二个树形结构的数据,python 的xml模块帮衬对xml文件的操作。
xml分为多少个部分:标签(tag),属性(attrib),内容(text)。标签一般有多级标签。

# 获取xml的根标签
import xml.etree.ElementTree as ET

tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)

#遍历xml文档, 使用多层循环,获取多层数据
for child in root:
    print('========>',child.tag,child.attrib,child.attrib['name'])
    for i in child:
        print(i.tag,i.attrib,i.text)

#只遍历year 节点
for node in root.iter('year'):  # root.iter()表示从根节点开始扫描整个xml
    print(node.tag,node.text)

#修改
for node in root.iter('year'):
    new_year=int(node.text)+1
    node.text=str(new_year)
    node.set('updated','yes')   # tag.set用于设置属性
    node.set('version','1.0')
tree.write('test.xml')

#删除node
for country in root.findall('country'): #  tag.findall 只查找tag的下一层。 tag.find只查找tag下一层的一个符合数据。
   rank = int(country.find('rank').text)
   if rank > 50:
       root.remove(country)
tree.write('output.xml')

在country内添加(append)节点year2

import xml.etree.ElementTree as ET

tree = ET.parse("a.xml")
root=tree.getroot()
for country in root.findall('country'):    # 使用两层for循环遍历整个标签下的数据
    for year in country.findall('year'):  
        if int(year.text) > 2000:               #  标签.text 用于指定标签对应的数据项
            year2=ET.Element('year2')     #
            year2.text='新年'
            year2.attrib={'update':'yes'}
            country.append(year2) # 往country节点下添加子节点

tree.write('a.xml.swap')

shutil模块(高档文件、文件夹、压缩包管理模块)

ca88会员登录中心 21

ca88会员登录中心 22

ca88会员登录中心 23

 

化解办法,eval()函数将字符串,转变到字典;如下所示

configparser 模块

在采取mysql或许openstack的安插文件中,常常能够旁观如下的配置文件格式:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

选择configparser可以很有益于的读写配置消息的内容.

import configparser

config=configparser.ConfigParser()
config.read('my.cnf')
print(config.sections())   # 查看标题
print(config.options(config.sections()[0])) # 查看某个标题下的配置项
print(config.get('mysqld','socket')) # 查看某个标题下的某个配置项的值

输出:

['mysqld', 'mysqld_safe']
['datadir', 'socket', 'symbolic-links']
/var/lib/mysql/mysql.sock

借使获得的值中含有数字和布尔值,能够选用get的诀窍平素转换为对应的种类。

res1=config.getint('title','conf_option')
res2=config.getfloat('title','conf_option')
res3=config.getboolean('title','conf_option')

修改配置:

config.remove_section('mysqld') # 删除整个标题区域
config.remove_option('mysqld_safe','log-error') # 删除指定title的配置项
config.write(open('my.cnf','w'))  # 写入文件

丰富布局:

config.add_section('client')   # 添加一个标题
config.set('client','socket','/var/run/mysql.sock') # 在client标题下添加 socket = /var/run/mysql.sock
config.write(open('my.cnf','w'))  # 写入文件

subprocess模块

ca88会员登录中心 24

 

logging模块(主要)  (用于便捷记录日志且线程安全的模块)

ca88会员登录中心 25

ca88会员登录中心 26

ca88会员登录中心 27

ca88会员登录中心 28

ca88会员登录中心 29

 

postdata = '''{'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}'''
url = 'https://secure.elong.com/passport/ajax/elongLogin'
request = Session().post(url,data=eval(postdata))
print(request.json())

hashlib模块

ca88会员登录中心,hash:壹种算法 ,三.x里替代了md五模块和sha模块,首要提供 SHA一, SHA2二四,
SHA256, SHA3八肆, SHA512 ,MD5 算法
哈希算法的特色:
一.内容千篇一律则hash运算结果壹律,内容有点改造则hash值则变
2.不可逆推
三.1律算法:无论校验多少长度的数额,得到的哈希值长度固定。

对数码实行校验:

import hashlib
# 相同的内容校验结果一样
n=hashlib.md5('helloworld'.encode('utf-8'))   # 
print(n.hexdigest())

m=hashlib.md5('hello'.encode('utf-8'))
m.update('world'.encode('utf-8'))
print(m.hexdigest())

输出:

fc5e038d38a57032085441e7fe7010b0
fc5e038d38a57032085441e7fe7010b0

对文件进行校验:

import hashlib
m=hashlib.md5()
with open('my.cnf','rb') as f:
    for line in f:
        m.update(line)
print(m.hexdigest())

# 文件较大时不推荐使用一次读取文件的方式
m=hashlib.md5()
with open('my.cnf','rb') as f:
    m.update(f.read())
print(m.hexdigest())

在做加密算法时,通过撞库能够反解密码,所以一般对加密算法增加salt进行加密:

# 加盐处理
password='123456'
m=hashlib.md5('add salt code str'.encode('utf-8'))
m.update(password.encode('utf-8'))
print(m.hexdigest())

# 实际的处理字符串
n=hashlib.md5('add salt code str123456'.encode('utf-8'))
print(n.hexdigest())

输出的结果一致:

b7709cddef6897748d66663afdb5a003
b7709cddef6897748d66663afdb5a003


hashlib模块类似的还有1个hmac模块,这几个模块用法和hashlib相同,不过必须确认保证第二个字符一样,才能校验出一致的结果:

import hmac

h=hmac.new('hello'.encode('utf-8'))
h.update('world'.encode('utf-8'))
print(h.hexdigest())

k=hmac.new('hello'.encode('utf-8'))
k.update('wor'.encode('utf-8'))
k.update('ld'.encode('utf-8'))
print(k.hexdigest())

# 这里输出和上面两种结果不一致
g=hmac.new('hell'.encode('utf-8'))
g.update('oworld'.encode('utf-8'))
print(g.hexdigest())

输出:

0e2564b7e100f034341ea477c23f283b
0e2564b7e100f034341ea477c23f283b
e705e80d60a2e0851a23dcd1773099ab

有人可能会说,你那不是不乏先例吗?把postdata间接定义成字典不就行了;你说的不易确实能够这么

suprocess 模块

suprocess模块用于调用系统的shell命令.
试行命令之后,能够将指令的实施结果个别通过管道赋值给专门的学问输出和不当输出:

import subprocess

res=subprocess.Popen(r'ipconfig|findstr 192.168',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(res.stdout.read().decode('gbk'))
print(res.stderr.read().decode('gbk'))

出口结果:

   IPv4 地址 . . . . . . . . . . . . : 192.168.20.191
   默认网关. . . . . . . . . . . . . : 192.168.20.254
   IPv4 地址 . . . . . . . . . . . . : 192.168.56.1

若果发生错误,提醒新闻就会从stderr中输出。
在linux平台也足以动用同1的用法。
也足以应用stdin将事先的输出结果输入到当前的下令中进行,重临结果:

import subprocess

res=subprocess.Popen(r'ipconfig',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
res1=subprocess.Popen(r'findstr 192.168.20',shell=True,stdin=res.stdout,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
print(res1.stdout.read().decode('gbk'))

出口结果:

   IPv4 地址 . . . . . . . . . . . . : 192.168.20.191
   默认网关. . . . . . . . . . . . . : 192.168.20.254
postdata = {'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}
url = 'https://secure.elong.com/passport/ajax/elongLogin'
request = Session().post(url,data=postdata)
print(request.json())

唯独只要以下那串数据,存款和储蓄在数据库中,或然excel中,读出来的时候暗中认可就是字符串,要是读出来直接接纳就会现出本文的失实,

所以哪个地方错了那个要明了,那是三个小细节;调节和测试输出,开采输出跟以下是平等的,

尚未错呀那是字典呢{‘xxxx’:’xxx’……….},然则它正是字符串。轻便被忽视,所以还要选取eval(postdata)函数转成字典

{'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}

毋庸置疑代码:

postdata = '''{'userName':'13718651996',
            'passwd':'yhlxxxx870120',
            'validateCode':'abc',
            'rememberMe':'true'}'''
url = 'https://secure.elong.com/passport/ajax/elongLogin'
request = Session().post(url,data=eval(postdata))
print(request.json())

------------------------------作者是华丽的分隔线----------------------------------

二、join拼接路线

os.path.join拼接路线,蒙受的主题材料,平常会把本人绕进去

 

str = r'd:\PHJ\Reporter\LOGS'
#报告文件路径
reporPath = os.path.join(str,'report')
isExistPath(reporPath) #创建文件夹

print(reporPath)

imgPath = os.path.join(reporPath,'\\Image')
print(imgPath)

 

错误输出输出:

d:\PHJ\Reporter\LOGS\report
d:\Image

大家期望结果:

d:\PHJ\Reporter\LOGS\report
d:\PHJ\Reporter\LOGS\report\Image

是否很想得到,难点到底出在哪儿,那个主题素材让自个儿纠结了深切,二个不太注意的小意思。

ca88会员登录中心 30

是的,大家正是东拼西凑的时候,多了四个返斜扛。去掉后难点化解。

 

3、写完项目,直接在管理器中双击py文件,报文件中引用的包找不到

品类组织,要推行run文件夹下的run.py ;报找不到run文件中引用的包

ca88会员登录中心 31

案由:双击推行的时候,不会自动进化搜索包,只会在最近文件夹及子文件夹中探求

那么怎么做呢,把实行文书,在项目根目录下建个run.py做为实践入口,难点解决。

ca88会员登录中心 32

 

您或然会说了,这样做,作者有个别引用路径的地点不对了,那小编测度是收获路径的方式是

os.getcur
 获取当前路线,那样一来,你种种文件用的不2法门都以现阶段援引文件所在的路子

据此建议起个gl文件,用来囤积路线。等音讯。

os.path.abspath(os.path.dirname(__file__))
用那个得到当前路径,而不要用os.getcur

要不,即便你把获得路线那一个,配置到gl也正是单身一个py中,那么不相同任务调用。路线也会区别。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图