本文目錄一覽:
- 1、用python 跑一個小腳本,要吃多少內存
- 2、我執行一段python腳本報錯了,怎麼解決
- 3、怎樣開始寫第一個基於python的selenium腳本
- 4、python腳本第一行怎麼寫
- 5、Linux 下Python 腳本編寫的quot;奇技淫巧quot;
- 6、想用python編寫一個腳本,登錄網頁,在網頁里做一系列操作,應該怎樣實現?
用python 跑一個小腳本,要吃多少內存
可以檢測一下
工作中需要根據某個應用程序具體吃了多少內存來決定執行某些操作,所以需要寫個小工具來模擬應用程序使用內存情況,下面是我寫的一個Python腳本的實現。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import re
import time
def print_help():
print ‘Usage: ‘
print ‘ python mem.py 100MB’
print ‘ python mem.py 1GB’
if __name__ == “__main__”:
if len(sys.argv) == 2:
pattern = re.compile(‘^(\d*)([M|G]B)$’)
match = pattern.match(sys.argv[1].upper())
if match:
num = int(match.group(1))
unit = match.group(2)
if unit == ‘MB’:
s = ‘ ‘ * (num * 1024 * 1024)
else:
s = ‘ ‘ * (num * 1024 * 1024 * 1024)
time.sleep(10000)
else:
print_help()
else:
print_help()
使用方法如下:
python mem.py 100M
python mem.py 1G1212
我執行一段python腳本報錯了,怎麼解決
在程序運行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤代碼,這樣,就可以知道是否有錯,以及出錯的原因。在操作系統提供的調用中,返回錯誤碼非常常見。比如打開文件的函數open(),成功時返迴文件描述符(就是一個整數),出錯時返回-1。
用錯誤碼來表示是否出錯十分不便,因為函數本身應該返回的正常結果和錯誤碼混在一起,造成調用者必須用大量的代碼來判斷是否出錯:
複製代碼代碼如下:
def foo():
r = some_function()
if r==(-1):
return (-1)
# do something
return r
def bar():
r = foo()
if r==(-1):
print ‘Error’
else:
pass
一旦出錯,還要一級一級上報,直到某個函數可以處理該錯誤(比如,給用戶輸出一個錯誤信息)。
所以高級語言通常都內置了一套try…except…finally…的錯誤處理機制,Python也不例外。
try
讓我們用一個例子來看看try的機制:
複製代碼代碼如下:
try:
print ‘try…’
r = 10 / 0
print ‘result:’, r
except ZeroDivisionError, e:
print ‘except:’, e
finally:
print ‘finally…’
print ‘END’
當我們認為某些代碼可能會出錯時,就可以用try來運行這段代碼,如果執行出錯,則後續代碼不會繼續執行,而是直接跳轉至錯誤處理代碼,即except語句塊,執行完except後,如果有finally語句塊,則執行finally語句塊,至此,執行完畢。
上面的代碼在計算10 / 0時會產生一個除法運算錯誤:
複製代碼代碼如下:
try…
except: integer division or modulo by zero
finally…
END
從輸出可以看到,當錯誤發生時,後續語句print ‘result:’, r不會被執行,except由於捕獲到ZeroDivisionError,因此被執行。最後,finally語句被執行。然後,程序繼續按照流程往下走。
如果把除數0改成2,則執行結果如下:
複製代碼代碼如下:
try…
result: 5
finally…
END
由於沒有錯誤發生,所以except語句塊不會被執行,但是finally如果有,則一定會被執行(可以沒有finally語句)。
你還可以猜測,錯誤應該有很多種類,如果發生了不同類型的錯誤,應該由不同的except語句塊處理。沒錯,可以有多個except來捕獲不同類型的錯誤:
複製代碼代碼如下:
try:
print ‘try…’
r = 10 / int(‘a’)
print ‘result:’, r
except ValueError, e:
print ‘ValueError:’, e
except ZeroDivisionError, e:
print ‘ZeroDivisionError:’, e
finally:
print ‘finally…’
print ‘END’
int()函數可能會拋出ValueError,所以我們用一個except捕獲ValueError,用另一個except捕獲ZeroDivisionError。
此外,如果沒有錯誤發生,可以在except語句塊後面加一個else,當沒有錯誤發生時,會自動執行else語句:
複製代碼代碼如下:
try:
print ‘try…’
r = 10 / int(‘a’)
print ‘result:’, r
except ValueError, e:
print ‘ValueError:’, e
except ZeroDivisionError, e:
print ‘ZeroDivisionError:’, e
else:
print ‘no error!’
finally:
print ‘finally…’
print ‘END’
Python的錯誤其實也是class,所有的錯誤類型都繼承自BaseException,所以在使用except時需要注意的是,它不但捕獲該類型的錯誤,還把其子類也“一網打盡”。比如:
複製代碼代碼如下:
try:
foo()
except StandardError, e:
print ‘StandardError’
except ValueError, e:
print ‘ValueError’
第二個except永遠也捕獲不到ValueError,因為ValueError是StandardError的子類,如果有,也被第一個except給捕獲了。
Python所有的錯誤都是從BaseException類派生的
使用try…except捕獲錯誤還有一個巨大的好處,就是可以跨越多層調用,比如函數main()調用foo(),foo()調用bar(),結果bar()出錯了,這時,只要main()捕獲到了,就可以處理:
複製代碼代碼如下:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar(‘0’)
except StandardError, e:
print ‘Error!’
finally:
print ‘finally…’
也就是說,不需要在每個可能出錯的地方去捕獲錯誤,只要在合適的層次去捕獲錯誤就可以了。這樣一來,就大大減少了寫try…except…finally的麻煩。
調用堆棧
如果錯誤沒有被捕獲,它就會一直往上拋,最後被Python解釋器捕獲,打印一個錯誤信息,然後程序退出。來看看err.py:
複製代碼代碼如下:
# err.py:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
bar(‘0’)
main()
執行,結果如下:
複製代碼代碼如下:
$ python err.py
Traceback (most recent call last):
File “err.py”, line 11, in module
main()
File “err.py”, line 9, in main
bar(‘0’)
File “err.py”, line 6, in bar
return foo(s) * 2
File “err.py”, line 3, in foo
return 10 / int(s)
ZeroDivisionError: integer division or modulo by zero
出錯並不可怕,可怕的是不知道哪裡出錯了。解讀錯誤信息是定位錯誤的關鍵。我們從上往下可以看到整個錯誤的調用函數鏈:
錯誤信息第1行:
複製代碼代碼如下:
Traceback (most recent call last):
告訴我們這是錯誤的跟蹤信息。
第2行:
複製代碼代碼如下:
File “err.py”, line 11, in module
main()
調用main()出錯了,在代碼文件err.py的第11行代碼,但原因是第9行:
複製代碼代碼如下:
File “err.py”, line 9, in main
bar(‘0’)
調用bar(‘0’)出錯了,在代碼文件err.py的第9行代碼,但原因是第6行:
複製代碼代碼如下:
File “err.py”, line 6, in bar
return foo(s) * 2
原因是return foo(s) * 2這個語句出錯了,但這還不是最終原因,繼續往下看:
複製代碼代碼如下:
File “err.py”, line 3, in foo
return 10 / int(s)
原因是return 10 / int(s)這個語句出錯了,這是錯誤產生的源頭,因為下面打印了:
複製代碼代碼如下:
ZeroDivisionError: integer division or modulo by zero
根據錯誤類型ZeroDivisionError,我們判斷,int(s)本身並沒有出錯,但是int(s)返回0,在計算10 / 0時出錯,至此,找到錯誤源頭。
記錄錯誤
如果不捕獲錯誤,自然可以讓Python解釋器來打印出錯誤堆棧,但程序也被結束了。既然我們能捕獲錯誤,就可以把錯誤堆棧打印出來,然後分析錯誤原因,同時,讓程序繼續執行下去。
Python內置的logging模塊可以非常容易地記錄錯誤信息:
複製代碼代碼如下:
# err.py
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar(‘0’)
except StandardError, e:
logging.exception(e)
main()
print ‘END’
同樣是出錯,但程序打印完錯誤信息後會繼續執行,並正常退出:
複製代碼代碼如下:
$ python err.py
ERROR:root:integer division or modulo by zero
Traceback (most recent call last):
File “err.py”, line 12, in main
bar(‘0’)
File “err.py”, line 8, in bar
return foo(s) * 2
File “err.py”, line 5, in foo
return 10 / int(s)
ZeroDivisionError: integer division or modulo by zero
END
通過配置,logging還可以把錯誤記錄到日誌文件里,方便事後排查。
拋出錯誤
因為錯誤是class,捕獲一個錯誤就是捕獲到該class的一個實例。因此,錯誤並不是憑空產生的,而是有意創建並拋出的。Python的內置函數會拋出很多類型的錯誤,我們自己編寫的函數也可以拋出錯誤。
如果要拋出錯誤,首先根據需要,可以定義一個錯誤的class,選擇好繼承關係,然後,用raise語句拋出一個錯誤的實例:
複製代碼代碼如下:
# err.py
class FooError(StandardError):
pass
def foo(s):
n = int(s)
if n==0:
raise FooError(‘invalid value: %s’ % s)
return 10 / n
執行,可以最後跟蹤到我們自己定義的錯誤:
複製代碼代碼如下:
$ python err.py
Traceback (most recent call last):
…
__main__.FooError: invalid value: 0
只有在必要的時候才定義我們自己的錯誤類型。如果可以選擇Python已有的內置的錯誤類型(比如ValueError,TypeError),盡量使用Python內置的錯誤類型。
最後,我們來看另一種錯誤處理的方式:
複製代碼代碼如下:
# err.py
def foo(s):
n = int(s)
return 10 / n
def bar(s):
try:
return foo(s) * 2
except StandardError, e:
print ‘Error!’
raise
def main():
bar(‘0’)
main()
在bar()函數中,我們明明已經捕獲了錯誤,但是,打印一個Error!後,又把錯誤通過raise語句拋出去了,這不有病么?
其實這種錯誤處理方式不但沒病,而且相當常見。捕獲錯誤目的只是記錄一下,便於後續追蹤。但是,由於當前函數不知道應該怎麼處理該錯誤,所以,最恰當的方式是繼續往上拋,讓頂層調用者去處理。
raise語句如果不帶參數,就會把當前錯誤原樣拋出。此外,在except中raise一個Error,還可以把一種類型的錯誤轉化成另一種類型:
複製代碼代碼如下:
try:
10 / 0
except ZeroDivisionError:
raise ValueError(‘input error!’)
只要是合理的轉換邏輯就可以,但是,決不應該把一個IOError轉換成毫不相干的ValueError。
小結
Python內置的try…except…finally用來處理錯誤十分方便。出錯時,會分析錯誤信息並定位錯誤發生的代碼位置才是最關鍵的。
程序也可以主動拋出錯誤,讓調用者來處理相應的錯誤。但是,應該在文檔中寫清楚可能會拋出哪些錯誤,以及錯誤產生的原因。
怎樣開始寫第一個基於python的selenium腳本
怎樣開始寫第一個基於python的selenium腳本
解答如下:
首先打開txt文件,使用open(txtName),進行一行一行的讀;
如果需要的話,對每行的數據進行解析;
導入xlrd,xlwt進行excel讀寫;
大致代碼如下:
import xlrd,xlwt
txtName=r”C:\value.txt”
workbook = xlwt.Workbook(encoding = ‘ascii’)
worksheet = workbook.add_sheet(‘sheet1’)
fp=open(txtName)
for linea in fp.readlines():
worksheet.write(0, 0, label = linea)
workbook.save(‘Excel_Workbook.xls’)
fp.close()
python腳本第一行怎麼寫
python腳本第一行的寫法:【#!/usr/bin/env python】。該語句告訴操作系統執行該腳本時,首先到env設置里查找python的安裝路徑,然後調用對應路徑下的解釋器程序完成操作。
腳本語言的第一行的目的就是指出,你想要你的這個文件中的代碼用什麼可執行程序去運行它。
(推薦教程:Python入門教程)
寫法:
#!/usr/bin/python是告訴操作系統執行這個腳本的時候,調用/usr/bin下的python解釋器。
#!/usr/bin/env python這種用法是為了防止操作系統用戶沒有將python裝在默認的/usr/bin路徑里。當系統看到這一行的時候,首先會到env設置里查找python的安裝路徑,再調用對應路徑下的解釋器程序完成操作。
#!/usr/bin/python相當於寫死了python路徑。
#!/usr/bin/env python會去環境設置尋找python目錄(建議寫法)。
Linux 下Python 腳本編寫的quot;奇技淫巧quot;
「 生命完美的答案,無非走過沒有遺憾 —《天藍》」
「如何能夠解析腳本運行命令行選項(位於 sys.argv 中)」
argparse 模塊可被用來解析命令行選項
常用來定義一個腳本的說明文檔,一般我們寫python腳本會通過 if..else 的方式來提供一個腳本說明文檔,python不支持switch。所以很麻煩,其實,我們可以通過 argparse 來編寫說明文檔。
我們來看看怎麼執行一個python腳本
對於熟悉Linux的小夥伴下面的文檔在熟悉不過了,這個一個標準Linxu軟件包的說明文檔,文檔中定義是軟件包的說明
來看看這個腳本是如何編寫的
為了解析命令行選項, 首先要創建一個 ArgumentParser 實例, 使用 add_argument() 方法聲明你想要支持的選項。在每個 add-argument() 調用中:
dest 參數指定解析結果被指派給屬性的名字。 metavar 參數被用來生成幫助信息。
action 參數 指定跟屬性對應的處理邏輯,通常的 值為 store , 被用來存儲 某個值 或將 多個參數值收集到一個列表中 。
nargs 參數收集 所有剩餘的命令行參數到一個列表中。在本例中它被用來構造一個文件名列表
action=’store_true’ 根據參數是否存在來設置一個位置 Boolean 標誌:
action=’store’ 參數接受一個單獨值並將其存儲為一個字符串
如果一個都沒有,會提示缺少參數 -p/–pat
choices={‘slow’, ‘fast’}, 參數說明接受一個值,但是會將其和可能的選擇值做比較,以檢測其合法性:
一旦參數選項被指定,你就可以執行 parser.parse() 方法了。它會處理 sys.argv 的值並返回一個結果實例。每個參數值會被設置成該實例中 add_argument() 方法的 dest 參數指定的屬性值。
還很多種其他方法解析命令行選項。可以會手動地處理 sys.argv 或者使用 getopt 模塊 。但是,如果你採用本節的方式,將會減少很多冗餘代碼,底層細節 argparse 模塊 已經幫你處理好了。你可能還會碰到使用 optparse 庫解析選項的代碼。儘管 optparse 和 argparse 很像 ,但是後者更先進,因此在新的程序中你應該使用它。
「你寫了個腳本,運行時需要一個密碼。此腳本是交互式的,因此不能將密碼在腳本中硬編碼,而是需要彈出一個密碼輸入提示,讓用戶自己輸入。」
Python 的 getpass 模塊 正是你所需要的。你可以讓你很輕鬆地彈出密碼輸入提示,並且不會在用戶終端顯示密碼。
代碼中 getpass.getuser() 不會彈出用戶名的輸入提示。它會根據該 用戶的 shell 環境 或者會依據 本地系統的密碼庫 (支持 pwd 模塊的平台)來使用 當前用戶的登錄名
在bash中編寫pytohn腳本接收外部數據的方式,一般情況下,對於一般變量,我們用命令行變量的方式比較多(手動的處理 sys.argv ),對於 文件內容或者bash命令輸出 直接通過腳本內部獲取需要的數據。
其實python 腳本也可以用其他方式來接收 傳遞給他的 文件數據或者bash命令輸出 ,包括將 命令行的輸出 通過 管道傳遞 給該腳本、 重定向文件到該腳本 ,或在 命令行中傳遞一個文件名 或 文件名列表 給該腳本。
這裡通過 Python 內置的 fileinput 模塊 ,可以實現重 定向,管道,以文佳輸出 的方式傳遞數據到腳本內部
使用 fileinput.input() 方法可以獲取當前輸入腳本的數據,腳本裡面用一個 FileInput 迭代器接收
文件直接接收
重定向接收
管道方式接收
fileinput.input() 創建並返回一個 FileInput 類的實例,該實例可以被當做一個 上下文管理器 使用。因此,整合起來,如果我們要寫一個打印多個文件輸出的腳本,那麼我們需要在輸出中包含文件名和行號
「你想執行一個外部命令並以 Python 字符串的形式獲取執行結果。」
使用 subprocess.check_output() 函數。
執行下試試
如果被執行的命令以非零碼返回,就會拋出異常。下面的例子捕獲到錯誤並獲取返回碼:
默認情況下, check_output() 僅僅返回輸入到標準輸出的值。如果你需要 同時收集標準輸出和錯誤輸出 ,使用 stderr 參數:
如果你需要用一個超時機制來執行命令,使用 timeout 參數:
通常來講,命令的執行 不需要 使用到 底層 shell 環境(比如 sh、bash) 。一個字符串列表會被傳遞給一個 低級系統命令 ,比如 os.execve() 。
如果你想讓 命令被一個shell 執行 ,傳遞一個字符串參數,並設置參數 shell=True . 有時候你想要 Python 去執行一個複雜的 shell 命令 的時候這個就很有用了,比如管道流、I/O 重定向和其他特性。例如:
是在 shell 中執行命令會存在一定的安全風險,特別是當參數來自於用戶輸入時。這時候可以使用 shlex.quote() 函數 來將參數正確的用雙引用引起來。
使用 check_output() 函數 是執行 外部命令 並獲取其 返回值 的最簡單方式。但是,如果你需要對 子進程做更複雜的交互 ,比如給它發送輸入,你得採用另外一種方法。這時候可直接使用 subprocess.Popen 類。
關於子進程,簡單來看下
也可以進程列表同協程結合的方式。你既可以在子shell中 進行繁重的處理工作,同時也不會讓子shell的I/O受制於終端。
如果直接丟到後台會自動在終端輸出IO
subprocess 模塊對於依賴 TTY 的外部命令不合適用 。例如,你不能使用它來自動化一個用戶輸入密碼的任務(比如一個 ssh 會話)。這時候,你需要使用到第三方模塊了,比如基於著名的 expect 家族的工具(pexpect 或類似的)(pexpect可以理解為Linux下的expect的Python封裝、通過pexpect可以實現對ssh、ftp、passwd、telnet等命令行進行自動交互,而無需人工干涉來達到自動化的目的。比如我們可以模擬一個FTP登錄時所有交互,包括輸入主機地址、用戶名、密碼、上傳文件等,待出現異常還可以進行嘗試自動處理。)
「你想向標準錯誤打印一條消息並返回某個非零狀態碼來終止程序運行」
通過 python 的 raise SystemExit(3) 命令可以主動拋出一個錯誤,通過 sys.stderr.write 將命令寫到標準的輸出端
直接將消息作為參數傳給 SystemExit() ,那麼你可以省略其他步驟
拋出一個 SystemExit 異常,使用錯誤消息作為參數,它會將消息在 sys.stderr 中打印,然後程序以狀態碼 1 退出
「你需要知道當前終端的大小以便正確的格式化輸出。」
使用 os.get terminal size() 函數 來做到這一點。
「複製或移動文件和目錄,但是又不想調用 shell 命令。」
shutil 模塊 有很多便捷的函數可以複製文件和目錄。使用起來非常簡單
這裡不多講,熟悉Linux的小夥伴應該不陌生。
默認情況下,對於 符號鏈接 這些命令處理的是它指向的東西文件。例如,如果 源文件 是一個 符號鏈接 ,那麼目標文件將會是 符號鏈接 指向的文件。如果你只想 複製符號鏈接本身 ,那麼需要指定 關鍵字 參數 follow_symlinks
copytree() 可以讓你在複製過程中選擇性的忽略某些文件或目錄。你可以提供一個忽略函數,接受一個目錄名和文件名列表作為輸入,返回一個忽略的名稱列表。例如:
對於文件元數據信息, copy2() 這樣的函數只能盡自己最大能力來保留它。 訪問時間、創建時間和權限 這些基本信息會被保留,但是 對於所有者、ACLs、資源 fork 和其他更深層次的文件元信息就說不準了
通常不會去使用 shutil.copytree() 函數 來執行 系統備份 。當處理文件名的時候,最好使用 os.path 中的函數來確保最大的可移植性
使用 copytree() 複製文件夾的一個棘手的問題是對於錯誤的處理,可以使用異常塊處理,或者通過 參數 ignore dangling symlinks=True 忽略掉無效符號鏈接。
「創建或解壓常見格式的歸檔文件(比如.tar, .tgz 或.zip)」
shutil 模塊擁有兩個函數—— make archive() 和 unpack archive() 可派上用場,
make archive() 的第二個參數是期望的輸出格式。可以使用 get archive formats() 獲取所有支持的歸檔格式列表。
「你需要寫一個涉及到文件查找操作的腳本,比如對日誌歸檔文件的重命名工具,你不想在 Python 腳本中調用 shell,或者你要實現一些 shell 不能做的功能。」
查找文件,可使用 os.walk() 函數 ,傳一個頂級目錄名給它
os.walk() 方法 為我們 遍歷目錄樹 ,每次進入一個目錄,它會返回一個 三元組 ,包含 相對於查找目錄的相對路徑,一個該目錄下的目錄名列表,以及那個目錄下面的文件名列表。
對於每個元組,只需檢測一下目標文件名是否在文件列表中。如果是就使用 os.path.join() 合併路徑。為了避免奇怪的路徑名比如 ././foo//bar ,使用了另外兩個函數來修正結果
os.walk(start) 還有跨平台的優勢。並且,還能很輕鬆的加入其他的功能。我們再演示一個例子,下面的函數打印所有最近被修改過的文件:
打印10分鐘之前被修改的數據
「怎樣讀取普通.ini 格式的配置文件?」
configparser 模塊 能被用來讀取配置文件
編寫配置文件
如果有需要,你還能修改配置並使用 cfg.write() 方法將其寫回到文件中
「你希望在腳本和程序中將診斷信息寫入日誌文件。」
python 腳本打印日誌最簡單方式是使用 logging 模塊
五個日誌調用( critical(), error(), warning(), info(), debug() )以降序方式表示不同的嚴重級別。 basicConfig() 的 level 參數是一個 過濾器 。所有級別低於此級別的日誌消息都會被忽略掉。每個 logging 操作的參數是一個消息字符串,後面再跟一個或多個參數。構造最終的日誌消息的時候我們使用了 % 操作符來格式化消息字符串。
如果你想使用配置文件,可以像下面這樣修改 basicConfig() 調用:
logconfig.ini
在調用日誌操作前先執行下 basicConfig() 函數方法 ,可以找標準輸出或者文件中輸出
basicConfig() 在程序中只能被執行一次。如果你稍後想改變日誌配置,就需要先獲取 root logger ,然後直接修改它。
更多見日誌模塊文檔
「你想給某個函數庫增加日誌功能,但是又不能影響到那些不使用日誌功能的程序。」
對於想要執行日誌操作的函數庫,你應該創建一個專屬的 logger 對象,並且像下面這樣初始化配置:
使用這個配置,默認情況下不會打印日誌,只有配置過日誌系統,那麼日誌消息打印就開始生效
通常來講,不應該在函數庫代碼中 自己配置日誌系統 ,或者是已經有個已經存在的日誌配置了。調用 getLogger( name ) 創建一個和調用模塊同名的 logger 模塊 。由於 模塊 都是唯一的,因此創建的 logger 也將是唯一 的。所以當前進程中只有一個logging會生效。
log.addHandler(logging.NullHandler()) 操作將一個 空處理器 綁定到剛剛已經創建好的 logger 對象 上。一個空處理器默認會忽略調用所有的日誌消息。因此,如果使用該函數庫的時候還沒有配置日誌,那麼將不會有消息或警告出現。
在這裡,根日誌被配置成僅僅 輸出 ERROR 或更高級別的消息 。不過, somelib 的日誌級別被單獨配置成可以輸出 debug 級別的消息, 它的優先級比全局配置高。像這樣更改單獨模塊的日誌配置對於調試來講是很方便的,因為你無需去更改任何的全局日誌配置——只需要修改你想要更多輸出的模塊的日誌等級。(這個還有待研究)
「你想記錄程序執行多個任務所花費的時間」
time 模塊 包含很多函數來執行跟時間有關的函數。儘管如此,通常我們會在此基礎之上構造一個更高級的接口來模擬一個計時器。
這個類定義了一個可以被用戶根據需要啟動、停止和重置的計時器。它會在elapsed 屬性中記錄整個消耗時間。下面是一個例子來演示怎樣使用它:
這裡通過 __enter__,__exit__ ,使用 with 語句 以及上下文管理器協議可以省略計時器打開和關閉操作。(關於上下文管理協議,即with語句,為了讓一個對象兼容with語句,必須在這個對象的類中聲明 __enter__和__exit__方法, , __enter__ 在出現with語句被調用, __exit__ 在代碼執行完畢被調用,可以參考open()方法)
在計時中要考慮一個 底層的時間函數問題 。 一般來說, 使用 time.time() 或 time.clock() 計算的時間精度因操作系統的不同會有所不同。而使用 time.perf_counter() 函數可以確保使用系統上面 最精確的計時器 。
「你想對在 Unix 系統上面運行的程序設置內存或 CPU 的使用限制。」
resource 模塊 能同時執行這兩個任務。例如,要限制 CPU 時間,下面的代碼在windows平台執行不了,但是Linux是可以的。
程序運行時, SIGXCPU 信號 在時間過期時被生成,然後執行清理並退出。
這暫時沒有好的Demo…
程序運行到沒有多餘內存時會拋出 MemoryError 異常。
setrlimit() 函數 被用來設置特定資源上面的 軟限制和硬限制 。
setrlimit() 函數 還能被用來設置 子進程數量、打開文件數以及類似系統資源的限制(cgroup) 。
「通過腳本啟動瀏覽器並打開指定的 URL 網頁」
webbrowser 模塊 能被用來啟動一個瀏覽器,並且與平台無關
新窗口打卡網站
當前窗口打開一個tab頁
指定瀏覽器類型,可以使用 webbrowser.get() 函數
想用python編寫一個腳本,登錄網頁,在網頁里做一系列操作,應該怎樣實現?
python編寫一個腳本的具體操作:
1、首先,打開python並創建一個新的PY文件。
2、其次,import os,因為涉及系統文件的路徑,因此首先在此處導入系統模塊。
3、隨後,可以雙擊打開HTML文件,然後就可以看到書寫的網頁,如下圖所示。
4、最後,添加html.close(),需添加此行代碼以關閉,否則將佔用大量內存,如下圖所示。這樣,用python簡單的製作一個網頁的所有操作就完成了。完成。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/271712.html