最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python讀取Ansible?playbooks返回信息示例解析

 更新時(shí)間:2023年12月11日 14:13:18   作者:東山絮柳仔  
這篇文章主要為大家介紹了Python讀取Ansible?playbooks返回信息示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

一.背景及概要設(shè)計(jì)

當(dāng)公司管理維護(hù)的服務(wù)器到達(dá)一定規(guī)模后,就必然借助遠(yuǎn)程自動(dòng)化運(yùn)維工具,而ansible是其中備選之一。Ansible基于Python開(kāi)發(fā),集合了眾多運(yùn)維工具(puppet、chef、func、fabric)的優(yōu)點(diǎn),實(shí)現(xiàn)了批量系統(tǒng)配置、批量程序部署、批量運(yùn)行命令等功能。Ansible是借助ssh來(lái)和遠(yuǎn)程主機(jī)通訊的,不需要在遠(yuǎn)程主機(jī)上安裝client/agents。因?yàn)樯鲜秩菀?,配置?jiǎn)單、功能強(qiáng)大、擴(kuò)展性強(qiáng),在生產(chǎn)應(yīng)用中得到了廣泛的應(yīng)用。使用過(guò)程中,讀取、解析、判斷、保存Ansible playbooks 的執(zhí)行返回信息是重要一壞。本文詳細(xì)描述如何實(shí)現(xiàn)Python讀取Ansible playbooks 執(zhí)行返回信息,并且保存到數(shù)據(jù)庫(kù)中。

Ansible playbooks 的返回信息

Ansible playbooks 的返回信息,有相應(yīng)的格式。

例如:

PLAY [play to setup web server] *****************************************************

TASK [Gathering Facts] **************************************************************
ok: [172.177.117.129]
ok: [172.177.117.130]

TASK [Installed the latest httpd version] ***********************************************
ok: [172.177.117.129]
ok: [172.177.117.130]

TASK [restart service] ***********************************************************
changed: [172.177.117.129]
changed: [172.177.117.130]

PLAY RECAP **************************************************************************
172.177.117.129 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.177.117.130 : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

從上面的例子可以看出,返回的運(yùn)行信息還是很豐富的,從中可以得出play、task的名字、每個(gè)task執(zhí)行情況,以及play運(yùn)行情況的概況。

即:

When you run a playbook, Ansible returns information about connections, the name lines of all your plays and tasks, whether each task has succeeded or failed on each machine, and whether each task has made a change on each machine. At the bottom of the playbook execution, Ansible provides a summary of the nodes that were targeted and how they performed. General failures and fatal “unreachable” communication attempts are kept separate in the counts.

重點(diǎn)及難點(diǎn):從結(jié)果中找出規(guī)律,格式化結(jié)果,怎么用正則表達(dá)式取得想要的信息。

二.表設(shè)計(jì)

通過(guò)對(duì)Ansible playbooks返回信息的分析,可以將其分成兩類(或者說(shuō)兩部分),一是play的整體執(zhí)行情況(主要信息為PLAY RECAP ),另一個(gè)是每個(gè)task的執(zhí)行詳情。因此,我們?cè)O(shè)計(jì)了兩張表。

2.1 設(shè)計(jì)用來(lái)保存【最終執(zhí)行結(jié)果】的表

ansible_play_recap

字段名字字段類型默認(rèn)值COMMENT
idbigint(20) NOT NULL AUTO_INCREMENT主鍵
manager_ipvarchar(100) NOT NULL管理節(jié)點(diǎn)
clusternamevarchar(200) NOT NULL集群名字
playnamevarchar(360)NOT NULLAnsible劇本名稱
playrecap_serveripvarchar(50)NOT NULLAnsible運(yùn)行節(jié)點(diǎn)(受管節(jié)點(diǎn))
playrecap_ok_qtyvarchar(10)NOT NULL成功運(yùn)行的task個(gè)數(shù)
playrecap_changed_qtyvarchar(10)NOT NULL產(chǎn)生效果的task個(gè)數(shù)
playrecap_unreachablevarchar(10)NOT NULL相應(yīng)的遠(yuǎn)程節(jié)點(diǎn)是否不可達(dá)
playrecap_failed_qtyvarchar(10)NOT NULL執(zhí)行失敗的task個(gè)數(shù)【注意,不可達(dá)的情況,即未執(zhí)行的情況下,失敗的個(gè)數(shù)記為0,此時(shí)是為執(zhí)行的】
playrecap_skipped_qtyvarchar(10)NOT NULL跳過(guò)的task的個(gè)數(shù)
playrecap_rescued_qtyvarchar(10)NOT NULL搶救的task的個(gè)數(shù)
playrecap_ignored_qtyvarchar(10)NOT NULL忽略的task的個(gè)數(shù)
create_timedatetime(6) NOT NULL插入時(shí)間
create_uservarchar(50)NOT NULL操作人

2.2 設(shè)計(jì)用來(lái)保存【各執(zhí)行步驟詳情】的表

ansible_task_palydetail

字段名字字段類型默認(rèn)值COMMENT
idbigint(20) NOT NULL AUTO_INCREMENT主鍵
manager_ipvarchar(100) NOT NULL管理節(jié)點(diǎn)
clusternamevarchar(200) NOT NULL集群名字
playnamevarchar(360)NOT NULLAnsible劇本名稱
task_serveripvarchar(50)NOT NULLAnsible運(yùn)行節(jié)點(diǎn)(受管節(jié)點(diǎn))
tasknamevarchar(360)NOT NULL任務(wù)名稱
task_statusvarchar(50)NOT NULL任務(wù)執(zhí)行結(jié)果
task_result_typevarchar(10)NOT NULL執(zhí)行結(jié)果類型(錯(cuò)誤類型)
task_messagesmediumtextNOT NULLTask運(yùn)行返回信息(錯(cuò)誤信息)
create_timedatetime(6) NOT NULL插入時(shí)間
create_uservarchar(50)NOT NULL操作人

注意:

(1)可以根據(jù)需要,在表中增加一列ansible_cmd,用來(lái)保存執(zhí)行的ansible的命令。

(2)為什么會(huì)有看著奇怪的manager_ip、clustername?因?yàn)?,這份代碼來(lái)自于對(duì)DB 集群的 部署 和 管理,可根據(jù)實(shí)際需要,修改取舍(即你的代碼可以把他們?nèi)サ簦?/strong>

三.Models設(shè)計(jì)

AnsiblePlayRecap的定義

class AnsiblePlayRecap(models.Model):
    """
    保存ansible最終執(zhí)行結(jié)果的表
    """
    id = models.AutoField('自增id', primary_key=True)
    manager_ip = models.CharField('MHA Manager IP', max_length=100)
    clustername = models.CharField('HA 集群名字', max_length=200, default='')
    playname = models.CharField('Ansible劇本名稱', max_length=360, default='')
    playrecap_serverip = models.CharField('受管節(jié)點(diǎn)', max_length=50, default='')
    playrecap_ok_qty = models.CharField('此節(jié)點(diǎn)成功運(yùn)行的task個(gè)數(shù)', max_length=10, default='')
    playrecap_changed_qty = models.CharField('產(chǎn)生效果的task個(gè)數(shù)', max_length=10, default='')
    playrecap_unreachable = models.CharField('相應(yīng)的遠(yuǎn)程節(jié)點(diǎn)是否不可達(dá)', max_length=10, default='')
    playrecap_failed_qty = models.CharField('執(zhí)行失敗的task個(gè)數(shù)', max_length=10, default='')
    playrecap_skipped_qty = models.CharField('跳過(guò)的task的個(gè)數(shù)', max_length=10, default='')
    playrecap_rescued_qty = models.CharField('搶救的task的個(gè)數(shù)', max_length=10, default='')
    playrecap_ignored_qty = models.CharField('忽略的task的個(gè)數(shù)', max_length=10, default='')
    create_time = models.DateTimeField('插入時(shí)間', auto_now=True)
    create_user = models.CharField('操作人', max_length=50, default='')

    class Meta:
        db_table = 'ansible_play_recap'
        verbose_name = '保存ansible最終執(zhí)行結(jié)果的表'

AnsibleTaskDetail的定義

class AnsibleTaskDetail(models.Model):
    """
    保存各task執(zhí)行詳情的表
    """
    id = models.AutoField('自增id', primary_key=True)
    manager_ip = models.CharField('MHA Manager IP', max_length=100)
    clustername = models.CharField('HA 集群名字', max_length=200, default='')
    playname = models.CharField('Ansible劇本名稱', max_length=360, default='')
    task_serverip = models.CharField('受管節(jié)點(diǎn)', max_length=50, default='')
    taskname = models.CharField('任務(wù)名稱', max_length=360, default='')
    task_status = models.CharField('任務(wù)執(zhí)行結(jié)果', max_length=50, default='')
    task_result_type = models.CharField('執(zhí)行結(jié)果的錯(cuò)誤類型', max_length=10, default='')
    task_messages = models.TextField('Task運(yùn)行返回信息')
    create_time = models.DateTimeField('插入時(shí)間', auto_now=True)
    create_user = models.CharField('操作人', max_length=50, default='')

    class Meta:
        db_table = 'ansible_task_palydetail'
        verbose_name = '保存各執(zhí)行步驟詳情的表'

四.生成SQL腳本

由model所在的項(xiàng)目名稱,通過(guò)運(yùn)行 python manage.py生成

假如項(xiàng)目名稱用XXXX代替

---生成腳本

python manage.py makemigrations XXXX

---顯示剛才生成的SQL腳本(0006為版本序列號(hào))

python manage.py sqlmigrate XXXX 0006

五. 主要功能代碼

調(diào)用代碼,需傳入的參數(shù)有三個(gè),

(1)shell_command 餐宿 -----即要執(zhí)行的Ansible Playbook 命令;

(2)manager_ip參數(shù)

(3)cluster_name 參數(shù)--- 這兩個(gè)命令前面已解釋了,因?yàn)槲覀兊倪@份代碼,其功能是為了維護(hù)數(shù)據(jù)庫(kù)集群的。在其他場(chǎng)景下,這兩個(gè)參數(shù)可以去掉。

5.1 執(zhí)行ansible 命令

聲明關(guān)于正則的模式;連接遠(yuǎn)程ansible主機(jī);獲取ansible 執(zhí)行結(jié)果;

from .ansible import ParamikoHelper
    ##paramiko 是一個(gè)用于在Python中執(zhí)行遠(yuǎn)程操作的模塊,支持SSH協(xié)議。它可以用于連接到遠(yuǎn)程服務(wù)器,執(zhí)行命令、上傳和下載文件,以及在遠(yuǎn)程服務(wù)器上執(zhí)行各種操作。
    ##字符串中關(guān)于IP地址的正則表達(dá)式
    ## ^:匹配字符串的開(kāi)頭。((25[0-5]|2[0-4]\d|[01]?\d\d?)\.):匹配一個(gè)數(shù)字和一個(gè)點(diǎn)號(hào),這個(gè)數(shù)字的取值范圍是0到255。
    ## {3}:匹配前面的表達(dá)式三次。(25[0-5]|2[0-4]\d|[01]?\d\d?):   配一個(gè)數(shù)字,這個(gè)數(shù)字的取值范圍是0到255。$:匹配字符串的結(jié)尾。
    ## 使用正則表達(dá)式匹配IP地址
    # 字符串是IP地址
    ip_pattern = r'^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)$'
    ##字符串是IP地址開(kāi)頭的
    ipstart_pattern = r'^((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)'
    ##字符串包含IP
    ipcontain_pattern = r'((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)'   
    ##字符串包含IP,并且IP地址是以': ['字符開(kāi)頭,以']'字符結(jié)尾
    ipcontain_pattern_plus = r'(\: \[)((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}((25[0-5]|2[0-4]\d|[01]?\d\d?)\])' 
    ansible_ip = '你的ansible server IP'
    ssh_port = 你的ssh_port
    ssh_username = '免密登錄設(shè)置的賬號(hào)'
    ph = ParamikoHelper(remote_ip=ansible_ip,remote_ssh_port=ssh_port,ssh_username=ssh_username)
    stdin, stdout, stderr = ph.exec_shell(shell_command)
    processor_result = stdout.readlines() #readlines()列表形式返回全文,每行作為一個(gè)字符串作為列表元素

5.2 開(kāi)始逐行解析返回的結(jié)果

先判斷這一行是否以Server IP開(kāi)頭(是的話,就是 PLAY RECAP 中的內(nèi)容 ),

還要判斷這一行 是否 有 以': ['字符開(kāi)頭,以']'字符結(jié)束的Server IP(如果是的話,很可能就是task部分的內(nèi)容)

兩個(gè)判斷是各自獨(dú)立的,相互沒(méi)有關(guān)系依賴。

### 先賦值,否則有可能報(bào)錯(cuò):UnboundLocalError: local variable 'XXXXX' referenced before assignment
    rplayname = ''
    rtask_result_type =''
    ###
    for pr_line in processor_result:
      logger.warning(f'{pr_line}')
      ## 判斷這個(gè)字符串是不是以IP地址開(kāi)頭
      ip_result = re.search(ipstart_pattern, pr_line)
      ## 判斷這個(gè)字符串是不是包含IP地址,并且IP以': ['字符開(kāi)頭,以']'字符結(jié)束  
      ip_plus_result = re.search(ipcontain_pattern_plus, pr_line) 
      ##獲取playname start

5.3 獲取playname 和taskname

根據(jù)是否含有'PLAY ['字符、'TASK ['字符進(jìn)行判斷和提取。

##獲取playname
      if 'PLAY [' in pr_line:
        ##使用的正則表達(dá)式'\[(.*?)\]',其中'\'為轉(zhuǎn)移符,用于表示左右中括號(hào)的匹配,'?'表示非貪婪模式,這個(gè)模式會(huì)匹配最短的符合要求的字符串。
        ## [0],因正則匹配后,放回的是數(shù)組,通過(guò)[0],轉(zhuǎn)換為字符串。
        rplayname = re.findall(r'\[(.*?)\]', pr_line)[0]##獲取task 的名稱
      elif 'TASK [' in pr_line:
        rtaskname = re.findall(r'\[(.*?)\]', pr_line)[0]

5.4 獲取 paly 執(zhí)行概況

即PLAY RECAP 部分內(nèi)容,主要依據(jù)是這行的字符是以IP地址開(kāi)頭的。 

## 判斷這個(gè)字符串是不是以IP地址開(kāi)頭
      elif ip_result: #字符串是IP地址開(kāi)頭的
        ## 此時(shí)pr_line的字符串格式如下:
        ## pr_line = '172.173.17.18               : ok=5    changed=2    unreachable=1    failed=0    skipped=6    rescued=7    ignored=8'
        rserverip = ip_result.group() ## 匹配的server IP
        ## print(rserverip) ##打印IP地址

        ## 正則表達(dá)式,\s+ ,將一個(gè)以多個(gè)空格或制表符為分隔符的字符串拆分成一個(gè)列表
        pr_line_lst = re.split(r"\s+", pr_line)
        ##分割后為: ['172.173.17.18', ':', 'ok=5', 'changed=2', 'unreachable=1', 'failed=0', 'skipped=6', 'rescued=7', 'ignored=8']
        for pr_arry in pr_line_lst:
          if 'ok=' in pr_arry:
            rplayrecap_ok_qty = pr_arry.split("ok=")[1] ##記得:字符串切割后返回的是數(shù)組,所以取第二個(gè)元素if 'changed=' in pr_arry:
            rplayrecap_changed_qty = pr_arry.split("changed=")[1]if 'unreachable=' in pr_arry:
            rplayrecap_unreachable = pr_arry.split("unreachable=")[1]if 'failed=' in pr_arry:
            rplayrecap_failed_qty = pr_arry.split("failed=")[1]if 'skipped=' in pr_arry:
            rplayrecap_skipped_qty = pr_arry.split("skipped=")[1]if 'rescued=' in pr_arry:
            rplayrecap_rescued_qty = pr_arry.split("rescued=")[1]if 'ignored=' in pr_arry:
            rplayrecap_ignored_qty = pr_arry.split("ignored=")[1]

5.5 將paly 概況數(shù)據(jù)插入表中

Django 框架,關(guān)于Model數(shù)據(jù)的寫入。

### 開(kāi)始向表[ansible_play_recap]中插入數(shù)據(jù),保存ansible最終執(zhí)行結(jié)果的表
        AnsiblePlayRecap.objects.create(manager_ip=manager_ip,clustername=cluster_name,playname=rplayname,playrecap_serverip=rserverip,
                                                    playrecap_ok_qty=rplayrecap_ok_qty,playrecap_changed_qty=rplayrecap_changed_qty,
                                                    playrecap_unreachable=rplayrecap_unreachable,playrecap_failed_qty=rplayrecap_failed_qty,
                                                    playrecap_skipped_qty=rplayrecap_skipped_qty,playrecap_rescued_qty=rplayrecap_rescued_qty,
                                                    playrecap_ignored_qty=rplayrecap_ignored_qty, create_user='Archery System'
                                                    )

5.6 獲取task執(zhí)行情況,并將數(shù)據(jù)保存到表中

如果這一行數(shù)據(jù)包含Server IP地址,并且這個(gè) IP以': ['字符開(kāi)頭,以']'字符結(jié)尾的,那么這行記錄的就是這個(gè)task在某受管節(jié)點(diǎn)的執(zhí)行情況。

## 判斷這個(gè)字符串是不是包含IP地址,并且IP以': ['字符開(kāi)頭,以']'字符結(jié)尾
      elif ip_plus_result: ##字符串包含IP,并且IP地址是以': ['字符開(kāi)頭,以']'字符結(jié)尾
        if 'ok: [' in pr_line:
          rtask_status = 'ok'
          rtask_messages = '' ## 賦值空
          ##查找server IP
          result = re.search(ipcontain_pattern, pr_line)
          rserverip = result.group() ## 匹配的server IP  
          ## print(rserverip)
        elif 'changed: [' in pr_line:
          rtask_status = 'changed'
          rtask_messages = '' ## 賦值空##查找server IP
          result = re.search(ipcontain_pattern, pr_line)
          rserverip = result.group() ## 匹配的server IP## 有些 返回的change 中還有其他信息,例如:changed: [192.168.168.192] => (item=perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm)
          ## 此時(shí)判斷下,是否包含 '] =>',如果包含,賦值給  
          if '] => ' in pr_line:
            rtask_messages= pr_line.split("] => ")[1]elif 'skipping: [' in pr_line:
          rtask_status = 'skipping'
          rtask_messages = '' ## 賦值空
          ##查找server IP
          result = re.search(ipcontain_pattern, pr_line)
          rserverip = result.group() ## 匹配的server IPelif 'fatal: [' in pr_line:
          rtask_status = 'fatal'
          rtask_messages = '' ## 賦值空
          rtask_result_type ='FAILED'##查找server IP
          result = re.search(ipcontain_pattern, pr_line)
          rserverip = result.group() ## 匹配的server IPif 'FAILED! =>' in pr_line:
            rtask_messages= pr_line.split("FAILED! =>")[1]else:
          rtask_status = 'NA'
          rtask_messages = '未知狀態(tài),請(qǐng)DBAcheck......' + pr_line
        ### 開(kāi)始向表中插入數(shù)據(jù)
        AnsibleTaskDetail.objects.create(manager_ip=manager_ip,clustername=cluster_name,playname=rplayname,playrecap_serverip=rserverip,
                                                    taskname=rtaskname,task_status=rtask_status,
                                                    task_result_type=rtask_result_type,task_messages=rtask_messages,
                                                    create_user='Archery System'
                                                    )

5.7 去除干擾項(xiàng)和無(wú)效項(xiàng)

elif len(pr_line) == 0 or pr_line == '\n' or ('PLAY RECAP *******' in  pr_line): ###判斷是否空 或只是 簡(jiǎn)單的換行符,再或者包含指定字符
           print("這一行為空行 或 說(shuō)明行,無(wú)需記錄!")

5.8 補(bǔ)充有效項(xiàng)

當(dāng)執(zhí)行task返回OK時(shí),,后面跟個(gè)IP,再后面一般不跟啥了;但是有時(shí)候還會(huì)由跟東西的。啥時(shí)候跟呢? 

例如:task   #debug:  #   msg: "你想要的返回信息。。。。。。"  這類命令時(shí)。

else:
        rtask_status = 'Mostly OK'
        rtask_result_type = 'debug+msg'   ##'經(jīng)常出現(xiàn)在task中有debug:msg:的時(shí)候'
        rtask_messages =  pr_line
        ### 開(kāi)始向表中插入數(shù)據(jù)
        AnsibleTaskDetail.objects.create(manager_ip=manager_ip,clustername=cluster_name,playname=rplayname,playrecap_serverip=rserverip,
                                                    taskname=rtaskname,task_status=rtask_status,
                                                    task_result_type=rtask_result_type,task_messages=rtask_messages,
                                                    create_user='Archery System'
                                                    )

        ###這段處理的情形不好想像,比較難懂,舉個(gè)例子
        ## ok: [192.168.168.192] => 
        ##  {
        ##     "msg": "MySQL Replication Health is OK!"
        ## }
        ##需要注意的時(shí),相應(yīng)的在表中也會(huì)保留多行數(shù)據(jù)。因?yàn)槲覀儠r(shí)逐行獲取,逐行解析,逐行報(bào)錯(cuò)的。不過(guò)慶幸的時(shí),順序都是對(duì)的。

六. 其他說(shuō)明

必須說(shuō)明的是:上面的Python代碼針對(duì)的是ansible host 文件保存的是Server IP,如果是域名,那么關(guān)于IP的正則是不可用的,代碼必須調(diào)整。

補(bǔ)充幾個(gè)task的返回信息的示例,方便理解代碼。

示例 1
ok: [192.168.168.192] => {\n', '    "msg": "MySQL Replication Health is OK!"\n', '}\n
示例 2
changed: [192.168.168.192] => (item=perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm)
示例 3
fatal: [192.168.168.192]: FAILED! => {"changed": false, "msg": "No package matching "test" found available, installed or updated", "rc": 126, "results": ["No package matching "test" found available, installed or updated']}""" 
示例 4
skipping: [192.168.168.192]
示例 5
changed: [192.168.168.192]
示例 6 
ok: [192.168.168.192]

Python讀取Ansible playbooks返回信息只是平臺(tái)的一個(gè)小功能,整個(gè)系統(tǒng)平臺(tái)采用的是Django框架。

以上就是Python讀取Ansible playbooks返回信息示例解析的詳細(xì)內(nèi)容,更多關(guān)于Python讀取Ansible playbooks的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Django 使用easy_thumbnails壓縮上傳的圖片方法

    Django 使用easy_thumbnails壓縮上傳的圖片方法

    今天小編就為大家分享一篇Django 使用easy_thumbnails壓縮上傳的圖片方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • python中 ? : 三元表達(dá)式的使用介紹

    python中 ? : 三元表達(dá)式的使用介紹

    剛剛學(xué)python的時(shí)候,時(shí)常糾結(jié)于python中沒(méi)有C語(yǔ)言中 ? : 的實(shí)現(xiàn),今天終于發(fā)現(xiàn)了兩種python的實(shí)現(xiàn)方式
    2013-10-10
  • Python讀取大量Excel文件并跨文件批量計(jì)算平均值的方法

    Python讀取大量Excel文件并跨文件批量計(jì)算平均值的方法

    這篇文章主要介紹了Python讀取大量Excel文件并跨文件批量計(jì)算平均值,介紹基于Python語(yǔ)言,實(shí)現(xiàn)對(duì)多個(gè)不同Excel文件進(jìn)行數(shù)據(jù)讀取與平均值計(jì)算的方法,需要的朋友可以參考下
    2023-02-02
  • python 安裝virtualenv和virtualenvwrapper的方法

    python 安裝virtualenv和virtualenvwrapper的方法

    下面小編就為大家?guī)?lái)一篇python 安裝virtualenv和virtualenvwrapper的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • NumPy中np.random.rand函數(shù)的實(shí)現(xiàn)

    NumPy中np.random.rand函數(shù)的實(shí)現(xiàn)

    np.random.rand是NumPy庫(kù)中的一個(gè)函數(shù),用于生成隨機(jī)數(shù),本文主要介紹了NumPy中np.random.rand函數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07
  • Python批量添加圖片水印的實(shí)現(xiàn)

    Python批量添加圖片水印的實(shí)現(xiàn)

    水印在很多時(shí)候都會(huì)使用的到,本文主要介紹了Python批量添加圖片水印的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python兩臺(tái)電腦實(shí)現(xiàn)TCP通信的方法示例

    Python兩臺(tái)電腦實(shí)現(xiàn)TCP通信的方法示例

    這篇文章主要介紹了Python兩臺(tái)電腦實(shí)現(xiàn)TCP通信的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python 實(shí)現(xiàn)在無(wú)序數(shù)組中找到中位數(shù)方法

    python 實(shí)現(xiàn)在無(wú)序數(shù)組中找到中位數(shù)方法

    這篇文章主要介紹了python 實(shí)現(xiàn)在無(wú)序數(shù)組中找到中位數(shù)方法,具有很好對(duì)參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Pycharm編輯器功能之代碼折疊效果的實(shí)現(xiàn)代碼

    Pycharm編輯器功能之代碼折疊效果的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Pycharm編輯器功能之代碼折疊效果的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • numpy中tensordot的用法

    numpy中tensordot的用法

    本文主要介紹了numpy中tensordot的用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論

屏南县| 城步| 措勤县| 德格县| 邯郸县| 洪江市| 金华市| 永宁县| 神农架林区| 广水市| 大庆市| 利津县| 东乌珠穆沁旗| 芷江| 建宁县| 满城县| 河西区| 盐城市| 沙雅县| 静安区| 双柏县| 科技| 福安市| 长岛县| 临朐县| 滕州市| 泸西县| 三江| 白水县| 尼玛县| 拉孜县| 渑池县| 邵阳市| 洞头县| 正镶白旗| 遵义市| 文山县| 株洲市| 吴旗县| 鹤岗市| 若羌县|