• [技术干货] python读取xml文件练习
    products.xml文件内容:<root>    <products>        <product uuid='1234'>            <id>10000</id>            <name>iPhone9</name>            <price>9999</price>        </product>        <product uuid='4321'>            <id>20000</id>            <name>特斯拉</name>            <price>1000000</price>        </product>        <product uuid='5678'>            <id>30000</id>            <name>Mac Pro</name>            <price>40000</price>        </product>            </products></root>vi demo.py# 读取与检索XML文件from xml.etree.ElementTree import parsedoc = parse('products.xml') #读取整个文件的句柄for item in doc.iterfind('products/product'): #解析单个产品    # 读取id节点的值    id = item.findtext('id')    # 读取name节点的值    name = item.findtext('name')    # 读取price节点的值    price = item.findtext('price')        #uuid = item.get('uuid')    print('uuid','=', item.get('uuid'))    print('id','=',id)    print('name','=',name)    print('price','=',price)    print('-----------------')    使用cloudIDE运行结果:user@a2ns6m9d57dyrps-machine:~/sdf-1635317644253$ /usr/bin/python /home/user/sdf-1635317644253/demo.pyuuid = 1234id = 10000name = iPhone9price = 9999-----------------uuid = 4321id = 20000name = 特斯拉price = 1000000-----------------uuid = 5678id = 30000name = Mac Proprice = 40000-----------------user@a2ns6m9d57dyrps-machine:~/sdf-1635317644253$ 
  • [其他] python字典
    字典是数据的无序集合,用于存储数据值。与其他仅将单个值作为项的数据类型不同,字典具有键-值对。字典中的键和值之间用冒号“:”分隔字典的三种赋值操作x = {'food':'Spam', 'quantity':4, 'color':'pink'} X =dict(food='Spam', quantity=4, color='pink') x = dict([("food", "Spam"),("b", "2"), ("color", "pink")]) dict.copy():拷贝数据d =x.copy() d['color'] = 'red' print(x) # {'food':'Spam','quantity':4,'color':'pink'} print(d) # {'food':'Spam','quantity':4,'color':'red'} 元素访问 print(d.get('name')) # 输出None print(d.get('name', '键值不存在!')) # 输出 键值不存在 print(d.keys()) # 输出dict_keys(['food', 'quantity', 'color']) print(d.values()) # 输出dict_values(['Spam', 4, 'pink']) print(d.items())   输出 dict_items([('food', 'Spam'), ('quantity', 4), ('color', 'pink')])d.clear() # 清空字典中的所有数据 print(d) # 输出 {} del(d) # 删除字典 print(d) # 程序异常,提示“d”未定义
  • [其他] python列表
    python中的列表是一个功能强大的集合,用中括号表示。列表的数据类型可以不一样,可以列表中包含列表。下面将列表的相关知识用代码展示一下:animals = ['cat', 'dog', 'monkey'] # list.append(obj):在列表末尾添加新的对象。 animals.append('fish') # 追加元素 print(animals) # 输出 ['cat', 'dog', 'monkey', ‘fish’] # list.remove(obj):移除列表中某个值的第一个匹配项。 animals.remove('fish') # 删除元素fish print(animals) # 输出 ['cat', 'dog', 'monkey'] # list.insert(index, obj):用于将指定对象插入列表的指定位置。index:插入位置 animals.insert(1,'fish') # 在下标1的地方插入元素fish print(animals) # 输出 ['cat', ‘fish’, 'dog', 'monkey'] # list.pop([index=-1]):要移除列表中对下标对应的元素(默认是最后一个)。Index:下标 animals.pop(1) # 删除下标为1的元素 print(animals) # 输出 ['cat', 'dog', 'monkey'] #遍历并获取元素和对应索引 # enumerate(sequence) :将一个可遍历的数据对象组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 for i in enumerate(animals): print(i) # 元素下标和元素所组成的索引 #输出:(0, cat) # (1, dog) # (2, monkey) #列表推导式 squares = [x*2 for x in animals] # 批量生成符合规则的元素组成的列表 print(squares) #['catcat ', 'dogdog ', 'monkeymonkey '] list1 = [12, 45, 32, 55] # list.sort(cmp=None, key=None, reverse=False):cmp为可选参数, 如果指定了该参数,会使用该参数的方法进行排序。key是用来进行比较的元素。reverse为排序规则,False为升序。 list1.sort() # 对列表进行排序 print(list1) # 输出[12, 32, 45, 55] # list.reverse():反向列表中元素。 list1.reverse() # 对列表进行逆置 print(list1) # 输出[55, 45, 32, 12]
  • [其他] Python面试经验与面试题总结
    关于Python的面试经验一般来说,面试官会根据求职者在简历中填写的技术及相关细节来出面试题。一位拿了大厂技术岗Special Offer的网友分享了他总结的面试经验。当时,面试官根据他在简历中所写的技术,面试题出的范围大致如下:· 数据类型有几种、有什么区别· 进程、线程、协程的定义及区别·深浅拷贝的区别· 常用开发模式·函数式编程、对象式编程· 闭包、装饰器· 垃圾回收机制· linux常用命令,举例说明1、如何在Python中管理内存?Python中的内存管理由Python私有堆空间管理。对象和数据结构位于私有堆中,开发者无权访问此私有堆,是Python解释器负责处理的。Python对象的堆空间分配由内存管理器完成。核心API提供了一些开发者编写代码的工具。Python内置的垃圾回收器会回收使用所有的未使用内存,使其适用于堆空间。2、解释Python中的Help()函数和Dir()函数。Help()函数是一个内置函数,作用是查看函数和详细说明模块用途。运行结果是:Dir()函数是Python内置函数,Dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。举个例子展示其使用方法:运行结果是:3、当Python退出时,是否会清除所有分配的内存?答案是否。当Python退出时,对其他对象具有循环引用的Python模块,以及从全局名称空间引用的对象不会被解除分配或释放。无法解除分配C库保留的那些内存部分。退出时,由于拥有自己的高效清理机制,Python会尝试取消分配/销毁其他所有对象。4、什么是猴子补丁?在运行期间动态修改一个类或模块。运行结果是:5、Python中的字典是什么?字典指的是Python中的内置数据类型。它定义了键和值之间的一对一关系,包含了一对键及其对应的值。字典由键索引。6、解释一下Python中的逻辑运算符。Python中有3个逻辑运算符:and,or,not。7、为什么不建议以下划线作为标识符的开头?Python没有私有变量的概念,所以约定速成以下划线为开头来声明一个变量为私有。如果不想让变量私有,则不要使用下划线开头。8、什么是Flask?Flask是Python编写的一款轻量级Web应用框架。WSGI 工具箱采用 Werkzeug ,模板引擎使用 Jinja2。Flask使用 BSD 授权。Werkzeug和Jinja2是其中的两个环境依赖。Flask不需要依赖外部库。9、解释Python中的join()和split()函数。Join()可用于将指定字符添加至字符串中。运行结果是:Split()可用于指定字符分割字符串。运行结果是:10、Python中的标识符长度有多长?标识符可以是任意长度。在命名标识符时还必须遵守以下规则:· 只能以下划线或者 A-Z/a-z 中的字母开头· 其余部分可以使用 A-Z/a-z/0-9· 区分大小写· 关键字不能作为标识符11、Python中是否需要缩进?需要。Python指定了一个代码块。循环,类,函数等中的所有代码都在缩进块中指定。通常使用四个空格字符来完成。如果开发者的代码没有缩进,Python将无法准确执行并且也会抛出错误。12、请解释使用*args的含义。当我们不知道向函数传递多少参数时,比如我们向传递一个列表或元组,我们就使用*args。运行结果是:13、深拷贝和浅拷贝之间的区别是什么?浅拷贝是将一个对象的引用拷贝到另一个对象上,如果在拷贝中改动,会影响到原对象。深拷贝是将一个对象拷贝到另一个对象中,如果对一个对象的拷贝做出改变时,不会影响原对象。14、Python中如何实现多线程?Python是多线程语言,其内置有多线程工具包。多线程能让我们一次执行多个线程。Python中的GIL(全局解释器锁)确保一次执行单个线程。一个线程保存GIL并在将其传递给下个线程之前执行一些操作,看上去像并行运行的错觉。事实上是线程在CPU上轮流运行。所有的传递会增加程序执行的内存压力。15、Python中的闭包是什么?当一个嵌套函数在其外部区域引用了一个值时,该嵌套函数就是一个闭包。其意义就是会记录这个值。比如:运行结果是:16、Python的优势有哪些?· Python 易于学习· 完全支持面向对象· 高效的高级数据结构,可用少量代码构建出多种功能· 拥有最成熟的程序包资源库之一· 跨平台而且开源17、什么是元组的解封装?首先,我们先展示解封装:将 3,4,5 封装到元组 mytuple 中,再将值解封装到变量 x,y,z 中:得到结果为12。18、什么是PEP?PEP代表Python Enhancement Proposal,是一组规则,指定如何格式化Python代码以获得最大可读性。19、列表和元组之间的区别是什么?主要区别是列表是可变的,元组是不可变的。比如以下举例:会出现以下报错:20、什么是Python模块?Python中有哪些常用的内置模块?Python模块是包含Python代码的.py文件。此代码可以是函数类或变量。常用的内置模块包括:random、data time、JSON、sys、math等。
  • [技术干货] python统计文件中单次出现的次数
    练习题:编写一个Python程序,从当前目录的文本文件words.txt中读取所有的内容(全都是英文单词),并统计其中每一个英文单词出现的次数。单词之间用逗号(,)、分号(;)或空格分隔,也可能是这3个分隔符一起分隔单词。将统计结果保存到字典中,并输出统计结果。假设words.txt文件的内容如下:test star test star star;bus  test bill,new yeah bill,book bike God start python whatvi demo.pyimport ref = open('words.txt','r')words = f.read()wordList = re.split('[ ,;]+',words)print(wordList)countDict = {}for word in wordList:        if countDict.get(word) == None:        countDict[word] = 1        else:                countDict[word] = int(countDict[word]) + 1for (key,value) in countDict.items():    print(key,'=',value)    f.close()用CloudIDE打开一个项目,新建上面的demo.py和words.txt。运行结果:user@wvvmphyg0xg5h3c-machine:~/ghj-1635257235820$ /usr/bin/python /home/user/ghj-1635257235820/demo.py['test', 'star', 'test', 'star', 'star', 'bus', 'test', 'bill', 'new', 'year', 'bill', 'book', 'bike', 'God', 'start', 'python', 'what']test = 3star = 3bus = 1bill = 2new = 1year = 1book = 1bike = 1God = 1start = 1python = 1what = 1user@wvvmphyg0xg5h3c-machine:~/ghj-1635257235820$常见的热词统计。
  • [技术干货] python中文件写入练习题
    这是李宁老师的python文件和流使用章节的课后习题,用星号生成菱形,只是这里要求写入文件。vi demo.py#编写一个Python程序,从控制台输入一个奇数,然后生成奇数行的星号(*)菱形,并将该菱形保存到当前目录下的stars.txt文件中。line = input('请输入行数(必须是奇数):')line = int(line)if line % 2 != 0:    f = open('stars.txt','w')    import os    spaceNum = line // 2    # 每行的最大空格数        i = 1        lineSpaceNum = spaceNum     # 当前行的前后空格数        # 生成上三角形        while lineSpaceNum >= 0:        f.write(' ' * lineSpaceNum)        f.write('*' * (2 * i - 1))        f.write(' ' * lineSpaceNum + os.linesep)         lineSpaceNum -= 1                i += 1        i -= 2        lineSpaceNum += 2    # 生成下三角形        while lineSpaceNum <= spaceNum:                f.write(' ' * lineSpaceNum)                f.write('*' * (2 * i - 1))                f.write(' ' * lineSpaceNum + os.linesep)               lineSpaceNum += 1                i -= 1        f.close()else:        print('必须输入奇数')应用cloudIDE的环境运行练习:me/user/phoenix-sample-1635252861617/demo.pye-1635252861617$ /usr/bin/python /hom请输入行数(必须是奇数):3user@n8tsvesj6aczqi2-machine:~/phoenix-sample-1635252861617$ /usr/bin/python /home/user/phoenix-sample-1635252861617/demo.py请输入行数(必须是奇数):21user@n8tsvesj6aczqi2-machine:~/phoenix-sample-1635252861617$ 
  • [技术干货] python中文件和流使用练习4
    python文件和流练习,使用FileInput对象读取文件vi demo.pyimport fileinputfileobj = fileinput.input('./url.txt')print(type(fileobj))print(fileobj.readline().rstrip())for line in fileobj:    #line = line.rstrip()    if line !='':         print(fileobj.lineno(),':',line)    else:        print(fileobj.filename())运行结果:user@e7q53zougr2la7e-machine:~/sdf-1635251478816$ /usr/bin/python /home/user/sdf-1635251478816/demo.py<class 'fileinput.FileInput'>http://www.baidu.com2 : https://www.jd.com3 : https://www.hao123.com4 : http://www.sohu.comuser@e7q53zougr2la7e-machine:~/sdf-1635251478816$ 这里遇到一个问题:readline()执行完,会将读完的行移出fileobj对象,后面的for循环读出的就是剩余的行。
  • [API使用] 在 python tuple中使用ops.Concat 进行tensor拼接错误
    【功能模块】mindspore.ops.Concat【操作步骤&问题现象】1、输入tensor变多之后 concat会报错 代码:(rois shape变成(6,5)就会报错) def construct(self, input_cls, input_reg, rois): cls_vector = self.reshape(self.roi_align(input_cls, rois), (rois.shape[0], -1)) reg_vector = self.reshape(self.roi_align(input_reg, rois), (rois.shape[0], -1)) # (N, 196, 7, 7) roi_cls_score = () roi_reg_score = () for per_roi in range(rois.shape[0]): cls_score = cls_vector[per_roi, 0::self.reg_stride].sum()/self.classes_num for per_class in range(1, self.classes_num): cls_score = mnp.append(cls_score, cls_vector[per_roi, per_class * self.bins_num::self.cls_stride].sum()/self.classes_num) reg_score = reg_vector[per_roi, 0::self.stride].sum() / 4 for per_axis in range(1,4): reg_score = mnp.append(reg_score, reg_vector[per_roi, per_axis * self.bins_num::self.reg_stride].sum()/4) roi_cls_score += (self.softmax(cls_score),) roi_reg_score += (reg_score,) roi_cls_score = self.concat(roi_cls_score) roi_reg_score = self.concat(roi_reg_score) return roi_cls_score, roi_reg_score import mindspore from mindspore import context context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", device_id=4) # roi = PSRoIAlign(7,7,0.0625,2) input_cls = Tensor(np.random.rand(1, 3969, 80, 38), mindspore.float32) input_reg = Tensor(np.random.rand(1, 196, 80, 38), mindspore.float32) rois = Tensor(np.array([[0,1,1,2,2],[1,30,30,50,50],[2,30,30,50,50],[3,30,30,50,50]]), mindspore.float32) //rois shape变成(6,5)就会报错 cls_score_map, reg_score_map = roi(input_cls,input_reg, rois) # (N, 81*7*7, 7, 7) print(cls_score_map.shape) print(reg_score_map.shape)【截图信息】rois shape为(5,5) 时返回 但(6,5)就会报错具体报错请看附件(ci3.7) [root@ascend90 fr]# python ps_roi_pool.py [ERROR] ANALYZER(7820,ffff8983f630,python):2021-10-25-22:09:52.345.962 [mindspore/ccsrc/pipeline/jit/static_analysis/evaluator.cc:77] EnterStackFrame] Exceed function call depth limit 1000, (function call depth: 1001, simulate call depth: 999), please call 'context.set_context(max_call_depth=value)' to adjust this value. [ERROR] DEBUG(7820,ffff8983f630,python):2021-10-25-22:09:52.346.059 [mindspore/ccsrc/debug/trace.cc:118] TraceGraphEval] *******************************graph evaluate stack********************************** [ERROR] DEBUG(7820,ffff8983f630,python):2021-10-25-22:09:52.375.526 [mindspore/ccsrc/debug/trace.cc:122] TraceGraphEval] 【日志信息】(可选,上传日志内容或者附件)
  • [技术干货] python中文件和流使用练习3
    python文件操作整行读写练习vi demo.py# 读行与写行import osf = open('./url.txt', 'r+')url = ''while True:        url = f.readline()        url = url.rstrip()        if url == '':        break;     else:               print(url)print('--------------')f.seek(0)print(f.readlines())f.write(os.linesep+'http://baidu.com' + os.linesep)f.close()f = open("./url.txt", 'a+')urlList = ['https://google.com' + os.linesep,'https://jd.com' + os.linesep]f.writelines(urlList)f.close()运行结果:user@yz0dz02025kev6h-machine:~/ghj-1635174013674$ /usr/bin/python /home/user/ghj-1635174013674/demo.pyhttps://123.com--------------['https://123.com\n']user@yz0dz02025kev6h-machine:~/ghj-1635174013674$ 文件 url.txt内容:https://123.comhttp://baidu.comhttps://google.comhttps://jd.com 
  • [技术干货] python中文件和流使用练习2
    python文件读写管道输出练习:vi demo1.py'''管道输出 |  从标准输入读取所有的数据,并按行将数据保存到列表中,然后过滤出所有包含“demo”的行,并输出这些行ls -al | python demo1.pysort'''import sysimport osimport re# 从标准输入读取全部数据text = sys.stdin.read()files = text.split(os.linesep)for file in files:        result = re.match('.*demo*',file)        if result != None:                print(file)    运行结果:user@uht0ff7cqwm3wk0-machine:~/ghj-1635172373079$ ls -al | python demo1.py-rw-r--r--  1 user user  439 Oct 25 22:42 demo1.py-rw-r--r--  1 user user    0 Oct 25 22:41 demo2.txt-rw-r--r--  1 user user    0 Oct 25 22:42 demo3.pyuser@uht0ff7cqwm3wk0-machine:~/ghj-1635172373079$ 搜噶,这样以后就可以批量处理日志文件拉取告警之类的了。
  • [算子使用] 在 python tuple中使用ops.Concat 进行tensor拼接
    输入tensor变多之后 concat会报错 代码:(rois shape变成(6,5)就会报错) def construct(self, input_cls, input_reg, rois): cls_vector = self.reshape(self.roi_align(input_cls, rois), (rois.shape[0], -1)) reg_vector = self.reshape(self.roi_align(input_reg, rois), (rois.shape[0], -1)) # (N, 196, 7, 7) roi_cls_score = () roi_reg_score = () for per_roi in range(rois.shape[0]): cls_score = cls_vector[per_roi, 0::self.reg_stride].sum()/self.classes_num for per_class in range(1, self.classes_num): cls_score = mnp.append(cls_score, cls_vector[per_roi, per_class * self.bins_num::self.cls_stride].sum()/self.classes_num) reg_score = reg_vector[per_roi, 0::self.stride].sum() / 4 for per_axis in range(1,4): reg_score = mnp.append(reg_score, reg_vector[per_roi, per_axis * self.bins_num::self.reg_stride].sum()/4) roi_cls_score += (self.softmax(cls_score),) roi_reg_score += (reg_score,) roi_cls_score = self.concat(roi_cls_score) roi_reg_score = self.concat(roi_reg_score) return roi_cls_score, roi_reg_score import mindspore from mindspore import context context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", device_id=4) # roi = PSRoIAlign(7,7,0.0625,2) input_cls = Tensor(np.random.rand(1, 3969, 80, 38), mindspore.float32) input_reg = Tensor(np.random.rand(1, 196, 80, 38), mindspore.float32) rois = Tensor(np.array([[0,1,1,2,2],[1,30,30,50,50],[2,30,30,50,50],[3,30,30,50,50]]), mindspore.float32) //rois shape变成(6,5)就会报错 cls_score_map, reg_score_map = roi(input_cls,input_reg, rois) # (N, 81*7*7, 7, 7) print(cls_score_map.shape) print(reg_score_map.shape)具体报错请看附件(ci3.7) [root@ascend90 fr]# python ps_roi_pool.py [ERROR] ANALYZER(7820,ffff8983f630,python):2021-10-25-22:09:52.345.962 [mindspore/ccsrc/pipeline/jit/static_analysis/evaluator.cc:77] EnterStackFrame] Exceed function call depth limit 1000, (function call depth: 1001, simulate call depth: 999), please call 'context.set_context(max_call_depth=value)' to adjust this value. [ERROR] DEBUG(7820,ffff8983f630,python):2021-10-25-22:09:52.346.059 [mindspore/ccsrc/debug/trace.cc:118] TraceGraphEval] *******************************graph evaluate stack********************************** [ERROR] DEBUG(7820,ffff8983f630,python):2021-10-25-22:09:52.375.526 [mindspore/ccsrc/debug/trace.cc:122] TraceGraphEval]
  • [技术干货] python中文件和流使用练习1
    python文件的打开方式常用的有5种:r:只读文件。w:写文件。r+:文件可读写,如果文件不存在,会抛出异常。如果文件存在,会从当前位置开始写入新内容,通过seek()可以改变当前文件的位置,也就是移动文件的指针。w+:文件可读写,如果文件不存在,会创建一个新文件;如果文件存在,会清空整个文件,并写入新内容。a+:文件可读写,如果文件不存在,会创建一个新文件;如果文件存在,会将要写入的内容添加到原文件的最后。也就是说,使用a+打开已经存在的文件,文件指针已经在文件的结尾了write(string):向文件写入内容,该函数会返回写入文件的字节数。read([n]):读取文件的内容,n是一个整数,表示从文件指针指定的位置开始读取的n个字节。如果不指定n,该函数会读取从当前位置往后的所有的字节。该函数会返回读取的数据。seek(n):重新设置文件指针,也就是改变文件的当前位置。如果使用write函数写入内容后需要使用seek(0)重置文件指针。close():关闭文件,对文件进行读写操作后,关闭文件是一个好习惯。vi demo1.py# 以写模式打开test1.txt文件f = open('./files/test1.txt','w')# 向test1.txt文件中写入“I love  ”“python”print(f.write("I love "))print(f.write("python"))f.close();f = open('./files/test1.txt','r')print(f.read(7))print(f.read(6))f.close();try:        f = open('./files/test2.txt','r+')  #打开一个不存在的文件,抛出异常except Exception as e:        print(e)# a+f = open('./files/test2.txt', 'a+')print(f.write('hello'))f.close();f = open('./files/test2.txt','a+')print('-----1------')print(f.read())  #已经在文件尾,读出空f.seek(0)      #指针移动至开头print('-----2------')print(f.read())  #读出全部内容f.close()# w+try:        f = open('./files/test2.txt','w+')        print(f.read())        f.write('How are you?')        f.seek(0)        print(f.read())finally:        f.close();执行结果:user@zsxyx1uggjsv8cj-machine:~/ghj-1635170591718$ /usr/bin/python /home/user/ghj-1635170591718/demo1.py76I love python[Errno 2] No such file or directory: './files/test2.txt'5-----1-----------2------helloHow are you?user@zsxyx1uggjsv8cj-machine:~/ghj-1635170591718$ 
  • [其他] python条件语句
    条件语句也称为判断语句,判断的定义为:如果条件满足(判断条件为Ture),我们就做某件事情;如果条件不满足(判断条件为false),就做另外一件事情,或者什么也不做。在Python的if语句中,通过判断一个或多个条件的布尔类型(Ture或false),选择不同的处理逻辑分支。当判断条件为Ture时,则执行条件语句后的代码块,否则执行else后的代码块。注意,在Python语言中,我们以相同的缩进来表示同一个代码块。示例如下:>>>if 1:              print("肯定分支逻辑")肯定分支逻辑>>>obj = { }>>>if obj:              print("否定分支逻辑")        else:              print("否定分支逻辑")       print("否定分支第二语句")否定分支逻辑否定分支第二语句在上述列子中,因为‘print("否定分支逻辑")‘ 与‘print("否定分支第二语句")’具有相同的缩进,所以它们被认为属于同一个代码块,当判断条件为false时,同时被执行。       另外,在Python语言中,false,None,“”, ( ) , [ ] , { } 在作为布尔表达式时,都会被解释器看成是假。在Python解释器中,True == 1,False == 0 .>>>bool({})false>>>bool(1)True>>>bool(True == 1)True>>>bool(True +False + 11)True
  • [其他] 本地IDE远程连接到ModelArts
    --- 本地IDE环境支持Pycharm和VSCode。通过简单配置,即可用本地IDE远程连接到ModelArts的Notebook开发环境中,调试和运行代码。 本章节介绍基于PyCharm环境访问Notebook的方式。 #### 前提条件 1. SSH远程调试功能只限PyCharm专业版,请先安装PyCharm专业版。 2. 创建一个Notebook实例,并开启远程SSH开发,配置远程访问IP白名单。该实例状态必须处于“运行中”. 3. 在Notebook实例详情页面获取开发环境IP地址(例如:dev-modelarts-cnnorth4.huaweicloud.com)和端口号。 **图1** Notebook实例详情页面 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/0004508hzkuynmyqzcto4z.png) 4. 准备好密钥对。 密钥对在用户第一次创建时,自动下载,之后使用相同的密钥时不会再有下载界面(用户一定要保存好),或者每次都使用新的密钥对。 #### Step1 配置SSH 1. 在本地的PyCharm开发环境中,单击File -> Settings -> Tools -> SSH Configurations,单击+号,增加一个SSH连接配置。 - Host: 云上开发环境的IP地址,即在开发环境实例页面远程访问模块获取的IP地址。例如:dev-modelarts-cnnorth4.huaweicloud.com - Port: 云上开发环境的端口,即在开发环境实例页面远程访问模块获取的端口号。 - User name: 固定为ma-user - Authentication type: Key pair方式 - Private key file: 存放在本地的云上开发环境私钥文件,即在创建开发环境实例时创建并保存的密钥对文件。 2. 单击修改图标将连接重命名,可以自定义一个便于识别的名字,单击OK。 3. 配置完成后,单击Test Connection测试连通性。 4. 选择Yes,显示Successfully connected表示网络可以连通,单击OK。 5. 在最下方再单击OK保存配置。 **图2** 配置SSH ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000939gzpjf1uk6wg3lccs.png) #### Step2 获取开发环境预置虚拟环境路径 1. 单击,则可连接到云端开发环境内。 2. 执行如下命令可在/home/ma-user/下面的README文件查看当前环境内置的Python虚拟环境。 3. 执行source命令可以切换到具体的Python环境中。 4. 执行which python查看python路径并拷贝出来,以备后续配置云上Python Interpreter使用。 **图3** 获取开发环境预置虚拟环境路径 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/0005485jnb5cgb3mnqlll9.png) #### Step3 配置云上Python Interpreter 1. 单击,单击设置图标![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000601cnarlkas1jtc7lqg.png),再单击“Add”,添加一个新的interpreter。 2. 选择“Existing server configuration”,在下拉菜单中选择上一步配置好的SSH configuration,单击“Next”。 3. 配置Python Interpreter - Interpreter:填写第一步拷贝的python路径,例如:/home/ma-user/anaconda3/envs/Pytorch-1.0.0/bin/python 如果路径为~/anaconda3/envs/Pytorch-1.0.0/bin/python 把~替换为/home/ma-user即可。 - Sync folders: 需要配置本地的工程目录文件同步到云上开发环境环境中的某个目录,推荐配置为/home/ma-user下的某个目录中(其他目录可能没有访问权限),例如/home/ma-user/work/projects。 4. 单右侧文件夹图标!,勾选上“Automatically upload”选项,以便于本地修改的文件自动上传到容器环境中。 5. 单击“Finish”,结束配置。 可以看到本地的工程文件已经自动往云上环境上传了。后续本地的文件每修改一下,都会自动的同步到云上的环境中。 右下角可以看到当前的Interpreter为Remote Interpreter。 **图4** 配置云上Python Interpreter ![](https://support.huaweicloud.com/engineers-modelarts/zh-cn_image_0000001117128730.gif "点击放大")![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000624q3ygij5aoucospv4.png) #### Step4 云上环境依赖库安装 在进入开发环境后,可以使用不同的虚拟环境,例如TensorFlow、PyTorch等,但是实际开发中,通常还需要安装其他依赖包,此时可以通过terminal连接到环境里操作。 单击工具栏,选择SSH Configuration中配置的开发环境。可以执行pip install安装所需要的包。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000633fy2zdsxs00rnigwk.png) #### Step5 在开发环境中调试代码 由于已经连接至云端开发环境,此时可以方便的在本地PyCharm中编码示例如、调测并运行。运行实际环境为云上开发环境,资源为云上昇腾AI处理器资源。可以做到本地编写修改代码,直接在云上环境运行。 像本地运行代码一样,直接单击运行按钮运行代码即可,此时虽然是在本地IDE单击的运行按钮,实际上运行的是云端开发环境里的代码,日志可以回显在本地的日志窗口。 **图5** 调试代码 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000640girrkgfa2sdw7hux.png) 也可以单击右上角的Run/Debug Configuration来设置运行的参数。 **图6** 设置运行参数 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000653mkgiemvosytputis.png) 当需要调试代码时,可以直接打断点,然后使用debug方式运行程序。 **图7** 代码打断点 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000701rxjbpgpis8tfl7wc.png) **图8** Debug方式调试 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000709cimgltgy5khobqta.png) 此时可以进入debug模式,代码运行暂停在该行,且可以查看变量的值。 **图9** Debug模式 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/202109/29/000718njf8cabzn3b56edz.png) 使用debug方式调试代码的前提是本地的代码和云端的代码是完全一致的,如果不一致可能会导致在本地打断点的行和实际运行时该行的代码并不一样,会出现意想不到的错误。 因此在配置云上Python Interpreter时,推荐选择Automatically upload选项,以保证本地的文件修改能自动上传到云端。
  • [技术干货] python子类继承super方法练习
    使用super函数,可以在子类实例中直接调用父类的方法。下面练习一个实例:vi demo03.pyclass Bird:    def __init__(self):        self.hungry = True        print('Bird的构造方法')    def eat(self):        if self.hungry:            print('已经吃了虫子')            self.hungry = False        else:            print('已经吃过了')b = Bird()b.eat()b.eat()class SongBird(Bird):    def __init__(self):        super().__init__() #使用super()函数调用父类的构造函数。        self.sound = '唱歌'        print('SongBird的构造方法')    def sing(self):        super().eat()        print(self.sound)sb = SongBird()sb.sing()sb.eat()print("---------------")class MyClass0:    def __init__(self):        print('MyClass0')class MyClass1(MyClass0):    def __init__(self):        print('MyClass1')    class MyClass2(MyClass1):    def __init__(self):        print('MyClass2')class MyClass3(MyClass2):    def __init__(self):        print('MyClass3')        super(MyClass1,self).__init__() #super()有两个参数,第一个参数是引用的类,第二个是所在的实例。m = MyClass3()运行结果,sb.eat()已经不报错了。9/demo03.py2us30-machine:~/ghj-1634805525109$ python /home/user/ghj-1634805525109Bird的构造方法已经吃了虫子已经吃过了Bird的构造方法SongBird的构造方法已经吃了虫子唱歌已经吃过了---------------MyClass3MyClass0user@ilgqw02us30-machine:~/ghj-1634805525109$