Python類彙總

watershed發表於2020-03-25

shutil:

shutil.copyfile( src, dst)   #從源src複製到dst中去。 如果當前的dst已存在的話就會被覆蓋掉

shutil.move( src, dst)  #移動檔案或重新命名

shutil.copymode( src, dst) #只是會複製其許可權其他的東西是不會被複制的

shutil.copystat( src, dst) #複製許可權、最後訪問時間、最後修改時間

shutil.copy( src, dst)  #複製一個檔案到一個檔案或一個目錄

shutil.copy2( src, dst)  #在copy上的基礎上再複製檔案最後訪問時間與修改時間也複製過來了,類似於cp –p的東西

shutil.copy2( src, dst)  #如果兩個位置的檔案系統是一樣的話相當於是rename操作,只是改名;如果是不在相同的檔案系統的話就是做move操作

shutil.copytree( olddir, newdir, True/Flase) #把olddir複製一份newdir,如果第3個引數是True,則複製目錄時將保持資料夾下的符號連線,如果第3個引數是False,則將在複製的目錄下生成物理副本來替代符號連線

shutil.rmtree( src )   #遞迴刪除一個目錄以及目錄內的所有內容


subprocess

subprocess 模組允許我們啟動一個新程式,並連線到它們的輸入/輸出/錯誤管道,從而獲取返回值。

使用 subprocess 模組

subprocess 模組首先推薦使用的是它的 run 方法,更高階的用法可以直接使用 Popen 介面。


run 方法語法格式如下:

subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None)

args:表示要執行的命令。必須是一個字串,字串引數列表。

stdin、stdout 和 stderr:子程式的標準輸入、輸出和錯誤。其值可以是 subprocess.PIPE、subprocess.DEVNULL、一個已經存在的檔案描述符、已經開啟的檔案物件或者 None。subprocess.PIPE 表示為子程式建立新的管道。subprocess.DEVNULL 表示使用 os.devnull。預設使用的是 None,表示什麼都不做。另外,stderr 可以合併到 stdout 裡一起輸出。

timeout:設定命令超時時間。如果命令執行時間超時,子程式將被殺死,並彈出 TimeoutExpired 異常。

check:如果該引數設定為 True,並且程式退出狀態碼不是 0,則彈 出 CalledProcessError 異常。

encoding: 如果指定了該引數,則 stdin、stdout 和 stderr 可以接收字串資料,並以該編碼方式編碼。否則只接收 bytes 型別的資料。

shell:如果該引數為 True,將透過作業系統的 shell 執行指定的命令。

run 方法呼叫方式返回 CompletedProcess 例項,和直接 Popen 差不多,實現是一樣的,實際也是呼叫 Popen,與 Popen 建構函式大致相同,例如:


例項

#執行ls -l /dev/null 命令

>>> subprocess.run(["ls", "-l", "/dev/null"])

crw-rw-rw-  1 root  wheel    3,   2  5  4 13:34 /dev/null

CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0)

returncode: 執行完子程式狀態,通常返回狀態為0則表明它已經執行完畢,若值為負值 "-N",表明子程式被終。


簡單例項:

例項

import subprocess

def runcmd(command):

    ret = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8",timeout=1)

    if ret.returncode == 0:

        print("success:",ret)

    else:

        print("error:",ret)


runcmd(["dir","/b"])#序列引數

runcmd("exit 1")#字串引數

輸出結果如下:

success: CompletedProcess(args=['dir', '/b'], returncode=0, stdout='test.py\n', stderr='')

error: CompletedProcess(args='exit 1', returncode=1, stdout='', stderr='')

Popen() 方法

Popen 是 subprocess的核心,子程式的建立和管理都靠它處理。


建構函式:


class subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, 

preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, 

startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False, pass_fds=(),

*, encoding=None, errors=None)

常用引數:


args:shell命令,可以是字串或者序列型別(如:list,元組)

bufsize:緩衝區大小。當建立標準流的管道物件時使用,預設-1。

0:不使用緩衝區

1:表示行緩衝,僅當universal_newlines=True時可用,也就是文字模式

正數:表示緩衝區大小

負數:表示使用系統預設的緩衝區大小。

stdin, stdout, stderr:分別表示程式的標準輸入、輸出、錯誤控制程式碼

preexec_fn:只在 Unix 平臺下有效,用於指定一個可執行物件(callable object),它將在子程式執行之前被呼叫

shell:如果該引數為 True,將透過作業系統的 shell 執行指定的命令。

cwd:用於設定子程式的當前目錄。

env:用於指定子程式的環境變數。如果 env = None,子程式的環境變數將從父程式中繼承。

建立一個子程式,然後執行一個簡單的命令:


例項

>>> import subprocess

>>> p = subprocess.Popen('ls -l', shell=True)

>>> total 164

-rw-r--r--  1 root root   133 Jul  4 16:25 admin-openrc.sh

-rw-r--r--  1 root root   268 Jul 10 15:55 admin-openrc-v3.sh

...

>>> p.returncode

>>> p.wait()

0

>>> p.returncode

這裡也可以使用 p = subprocess.Popen(['ls', '-cl']) 來建立子程式。


Popen 物件方法

poll(): 檢查程式是否終止,如果終止返回 returncode,否則返回 None。

wait(timeout): 等待子程式終止。

communicate(input,timeout): 和子程式互動,傳送和讀取資料。

send_signal(singnal): 傳送訊號到子程式 。

terminate(): 停止子程式,也就是傳送SIGTERM訊號到子程式。

kill(): 殺死子程式。傳送 SIGKILL 訊號到子程式。

例項

import time

import subprocess


def cmd(command):

    subp = subprocess.Popen(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")

    subp.wait(2)

    if subp.poll() == 0:

        print(subp.communicate()[1])

    else:

        print("失敗")


cmd("java -version")

cmd("exit 1")

輸出結果如下:


java version "1.8.0_31"

Java(TM) SE Runtime Environment (build 1.8.0_31-b13)

Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode)


失敗


訊號模組signal

儘管signal是Python中的模組,但主要針對UNIX平臺,而Windows核心中由於對訊號機制支援不充分,所以在Windows上的Python不能發會訊號系統的功能。


Python的signal模組負責程式內部的訊號處理,典型的操作包括訊號處理函式、暫停並等待訊號,定時發出SIGALRM等。


載入模組


import signal

訊號名稱

# 連線結束通話

signal.SIGUP

# 非法指令

signal.SIGILL

# 終止程式

signal.SIGINT

SIGINT訊號編號為2,當按下鍵盤CTRL+c組合鍵時程式會收到此訊號,用於終止程式。


# 暫停程式CTRL+z

signal.SIGSTP

# 殺死程式,此訊號不能被捕獲或忽略。

signal.SIGKILL

SIGKILL訊號用於強制殺死程式,此訊號程式無法忽視,直接在系統層面將程式殺死,所以在Python中它是不能監聽的。


# 終端退出

signal.SIGQUIT

# 終止訊號,軟體終止訊號。

signal.SIGTERM

當終端使用者輸入kill sigerm pid時對應PID的程式會接收到此訊號,此訊號程式是可以捕獲並指定函式處理。比如做一下程式清理等工作,當然也是可以忽視此訊號的。


# 鬧鐘訊號,由signal.alarm()發起。

signal.SIGALRM

# 繼續執行暫停程式

signal.SIGCONT

訊號處理函式

設定傳送SIGALRM訊號的定時器

signal.alarm(time)

功能:在time秒後向程式自身傳送SIGALRM訊號

引數:time為時間引數,單位為秒。

例如:設定時鐘


$ vim sigalrm.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-


import signal, time


# 3秒後終止程式

signal.alarm(3)


while True:

    time.sleep(1)

    print("working")

$ python sigalrm.py

working

working

鬧鐘

一個程式中只能設定一個時鐘,如果設定第二個則會覆蓋第一個的時間,並返回第一個的剩餘時間,同時第一個鬧鐘返回為0。


例如:當在一個程式中出現兩個signal.alarm()函式時


$ vim sigalrm.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-


import signal, time


# 3秒後終止程式

print(signal.alarm(3)) # output:0

time.sleep(1)

print(signal.alarm(3)) # output:2


while True:

    time.sleep(1)

    print("working")

$ python sigalrm.py

0

2

working

working

鬧鐘

使用signal.pause阻塞函式,讓程式暫停以等待訊號,也就時阻塞程式執行,簡單來說當接收到訊號後使程式停止。


例如:


$ vim sigalrm.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-


import signal, time


# 3秒後終止程式

print(signal.alarm(3)) # output:0

time.sleep(1)

print(signal.alarm(3)) # output:2


# 阻塞等待訊號的發生,無論什麼訊號都可以。

signal.pause()


while True:

    time.sleep(1)

    print("working")

$ python sigalrm.py

0

2

鬧鐘

使程式進入休眠

signal.pause()

作用:使程式進入休眠直到程式接收到某個訊號量

獲取當前程式註冊signalnum訊號量的處理函式

signal.getsignal(signalnum)

作用:獲取當前程式註冊signalnum訊號量的處理函式

返回值:可能使Python可呼叫物件如signal.SIG_DFL、signal.SIG_IGN、None。

設定訊號處理函式

signal.signal(sig, handler)

功能:按照handler處理器制定的訊號處理方案處理函式

引數:

sig擬需處理的訊號 ,處理訊號只針對這一種訊號其作用。

handler訊號處理方案,程式可以無視訊號採取預設操作也可自定義操作。

當handler為下列函式時將有如下操作


SIG_IGN訊號被無視ignore或忽略

SIG_DFL程式採用預設default行為處理

function處理器handler作為函式名稱時,程式採用自定義函式處理。

SIGSTOP SIGKILL不能處理只能採用

例如:


$ vim signal.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-


import signal, time


# 3秒後終止程式

signal.alarm(3)

# 當遇到SIGINT即CTRL+C時忽略SIG_IGN

signal.signal(signal.SIGINT, signal.SIG_IGN)

# 阻塞等待訊號的發生,無論什麼訊號都可以。

signal.pause()

$ python signal.py

鬧鐘

訊號攔截

為什麼需要設定訊號攔截呢?如果使用多執行緒或多協程,為了防止主執行緒結束而子執行緒和子協程還在執行,此時就需要使用signal模組,使用signal模組可以繫結一個處理函式,當接收步到訊號的時候不會立即結束程式。


在Python中攔截訊號通常有兩種方式


第一種是發出kill訊號

# SIGTERM 表示關閉程式訊號

signal.signal(signal.SIGTERM, self._term_handler)

第二種是發出CTRL+C訊號

# SIGINT表示CTRL+C訊號

signal.signal(signal.SIGINT, self._term_handler)

在多執行緒多協程的程式設計時,一般多執行緒或的多協程程式在設計時應該設計一個程式終止標記,當收到終止訊號的時候,讓終止標記狀態由False修改為True,此時執行的程式只有終止標記在False狀態下時才能夠以執行。如果由需要休眠的協程,還應給協程增加一個休眠標記,當程式休眠的時候休眠標記設定為True,當收到終止訊號的時候,不僅僅要把終止標記設定為True,還要將休眠中的協程結束掉。



argparse:


argparse是python用於解析命令列引數和選項的標準模組,類似於linux中的ls指令,後面可以跟著不同的引數選項以實現不同的功能,argparse就可以解析命令列然後執行相應的操作。


argparse 使用

使用argparse 配置命令列引數時,需要三步:


建立 ArgumentParser() 物件

呼叫 add_argument() 方法新增引數

使用 parse_args() 解析新增的引數

複製程式碼

    parser = argparse.ArgumentParser()


    parser.add_argument("-p", "--port",

        dest='port',

        default="/dev/ttyUSB0",

        help="serial port where the MCU is connected to.)


    parser.add_argument("-v", "--version",

        dest='version',

        action='store_true',

        help="show the version number of this program and exit.")


    args = parser.parse_args()

複製程式碼

 


某些情況下,你想將引數按照功能進行概念分組,以便使用者方便使用,比如寫操作的引數作為一個組,讀操作的引數作為一個組,可以使用 ArgumentParser.add_argument_group(title=None, description=None) 定義一個組。


1     info_group = parser.add_argument_group('Device information')

2     read_group = parser.add_argument_group('Read and compare functions')

3     write_group = parser.add_argument_group('Erase and write functions')

4     run_group = parser.add_argument_group('Code execution functions')

 


方法引數查詢表

1.ArgumentParser類


class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars=’-‘, fromfile_prefix_chars=None, argument_default=None, conflict_handler=’error’, add_help=True, allow_abbrev=True)


引數:


    prog:程式的名字

    usage:預設情況下,ArgumentParser依據它包含的引數計算出幫助資訊

    description:這個引數給出程式做什麼以及如何工作的簡短描述

    epilog:顯示額外的關於程式的描述

    parents:有時候,幾個解析器會共享一個共同的引數集。可以使用一個帶有所有共享引數的解析器傳遞給ArgumentParser的parents=引數,而不用重複定義這些引數

    formatter_class:ArgumentParser物件允許透過指定一個格式化類來定製幫助資訊的格式(argparse.RawDescriptionHelpFormatter、argparse.RawTextHelpFormatter、argparse.ArgumentDefaultsHelpFormatter、argparse.MetavarTypeHelpFormatter)

    prefix_chars:修改字首符

    fromfile_prefix_chars:以任意一個給定字元開始的引數將被當做檔案,並且將被這些檔案包含的引數替換

    argument_default:指定一個解析器範圍的引數預設值

    allow_abbrev:允許使用縮寫(預設)

    conflict_handler:關於設定同一個選項具有兩個動作

    add_help


2.ArgumentParser物件add_argument()方法


ArgumentParser.add_argument(name or flags…[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])


引數


    name or flags:傳遞給add_argument() 的第一個引數因此必須是一個標記序列或者一個簡單的引數名字

    action:指出應該如何處理命令列引數(支援的操作:’store’ ,’store_const’,’store_true’,’store_false’,’append’,’append_const’,’count’,’help’,’version’)

    nargs:將一個動作與不同數目的命令列引數關聯在一起(支援的值:N,’?’,’*’,’+’)

    const:用於儲存常量值,它們不是從命令列讀入但是是ArgumentParser 的動作所要求的

    default:其預設值為None,指出如果命令列引數沒有出現時它們應該是什麼值

    type:允許任意必要的型別檢查並作型別轉換

    choices:某些命令列引數應該從一個受限的集合中選擇

    required:如果要使得選項是必需的,可以指定True作為required=關鍵字引數的值給add_argument()

    help:包含引數簡短描述的字串

    metavar:預設情況下,對於位置引數直接使用dest的值,對於可選引數則將dest的值變為大寫。注意metavar只會改變顯示出來的名字parse_args() 物件中屬性的名字仍然由dest的值決定。

    dest:對於位置引數的動作,dest 通常作為第一個引數提供給add_argument(),對於可選引數的動作,dest的動作通常從選項字串推匯出來,如:ArgumentParser生成的dest的值是將第一個長的選項字串前面的–字串去掉。如果沒有提供長選項字串,dest的獲得則是將第一個短選項字串前面的-字元去掉。任何內部的-將被轉換為字元以確保字串是合法的屬性名字。(即對於可選引數,先找長的選項字串,再找短選項字串,並且內部的-會被轉換為字元。)


Action類

class argparse.Action(option_strings, dest, nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)



3.ArgumentParser物件parse_args()方法


將引數字串轉換成物件並設定成名稱空間的屬性。返回構成的名稱空間。

之前對add_argument() 的呼叫完全決定了建立什麼物件以及如何設定。


選項值語法,parse_args()方法支援幾種指定一個選項的值的方法:


    最簡單的方法是,將選項和它的值以兩個分開的引數傳遞

    對於長選項(名字長度超過一個字元的選項),選項和它的值還可以用一個單一的命令列引數傳遞,並用=分隔它們

    對於短選項(長度只有一個字元的選項),選項及其值可以連在一起

    幾個短選項可以連在一起僅使用一個-字首,只要只有最後一個選項要求有值或者都不要有值


無效引數

在解析命令列的同時,parse_args()會檢查各種錯誤,包括有歧義的選項、不合法的型別、不合法的選項、錯誤的位置引數個數等等。當它遇到此類錯誤時,會退出並跟隨用法資訊一起列印出錯誤。


引數包含“ - ”

parse_args()方法每當使用者犯了明確的錯誤時會努力給出錯誤資訊,但是有些情況天生就有歧義。例如,命令列引數-1既可以是想指明一個選項也可以是想提供一個位置引數。這裡parse_args()會非常小心:位置引數只有在它們看上去像負數且解析器中沒有選項看上去是負數時才可以以-開始。

如果你有必須以- 開始的位置引數且不是負數,你可以插入偽引數’–’告訴parse_args()其後的所有內容都為位置引數。


引數縮寫(字首匹配)


引數不來自sys.argv

有時候可能需要ArgumentParser解析的引數不是來自sys.argv。這可以透過傳遞一個字串列表給parse_args()來完成



4.class argparse.Namespace


parse_args() 預設使用的簡單的類,用於建立一個儲存屬性的物件並返回該物件。

有時可能需要讓ArgumentParser分配屬性給一個已經存在的物件而不是一個新的Namespace物件。這可以透過指定namespace=關鍵字引數達到。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/75730/viewspace-2682495/,如需轉載,請註明出處,否則將追究法律責任。

相關文章