歡迎加入 Python 官方文檔翻譯團隊:https://www.transifex.com/python-doc/
sys 模塊提供了與 Python 解釋器緊密相關的一些變量和函數,這些變量可能被解釋器使用,也可能由解釋器提供
sys 模塊官方文檔:https://docs.python.org/3/library/sys.html
部分常用函數:
1、sys.argv
獲取當前正在執行的命令行參數的參數列表
sys.argv[0]
返回當前程序名,sys.argv[1]
返回第一個參數
sys.argv[2]
返回第二個參數,len(sys.argv)-1
參數個數(減去文件名)
應用舉例:在桌面新建一個 test.py,文件路徑爲:C:\Users\Lenovo\Desktop\test.py,寫入以下內容:
import sys
print(sys.argv)
print('當前程序名:%s' %sys.argv[0])
print('第一個參數:%s' %sys.argv[1])
print('第二個參數:%s' %sys.argv[2])
print('參數個數:%s' %(len(sys.argv)-1))
用命令行運行該程序:
C:\Users\Lenovo\Desktop>test.py arg1 arg2
['C:\\Users\\Lenovo\\Desktop\\test.py', 'arg1', 'arg2']
當前程序名:C:\Users\Lenovo\Desktop\test.py
第一個參數:arg1
第二個參數:arg2
參數個數:2
2、sys.path
獲取模塊文件搜索路徑的字符串,或臨時指定新搜索路徑,可通過在主程序設置臨時搜索路徑來解決指定文件夾下模塊文件的導入問題
應用舉例:
>>> import sys # 導入 sys 模塊
>>> sys.path # 執行 path 函數
['', 'E:\\Python\\Lib\\idlelib', 'E:\\Python\\python36.zip', 'E:\\Python\\DLLs', 'E:\\Python\\lib', 'E:\\Python', 'C:\\Users\\Lenovo\\AppData\\Roaming\\Python\\Python36\\site-packages', 'E:\\Python\\lib\\site-packages', 'E:\\Python\\lib\\site-packages\\viz-0.0.5-py3.6.egg', 'E:\\Python\\lib\\site-packages\\win32', 'E:\\Python\\lib\\site-packages\\win32\\lib', 'E:\\Python\\lib\\site-packages\\Pythonwin']
>>> sys.path[0] = 'D:\\test' # 臨時指定新的搜索路徑
>>> sys.path # 顯示臨時指定的搜索路徑已經存在
['D:\\test', 'E:\\Python\\Lib\\idlelib', 'E:\\Python\\python36.zip', 'E:\\Python\\DLLs', 'E:\\Python\\lib', 'E:\\Python', 'C:\\Users\\Lenovo\\AppData\\Roaming\\Python\\Python36\\site-packages', 'E:\\Python\\lib\\site-packages', 'E:\\Python\\lib\\site-packages\\viz-0.0.5-py3.6.egg', 'E:\\Python\\lib\\site-packages\\win32', 'E:\\Python\\lib\\site-packages\\win32\\lib', 'E:\\Python\\lib\\site-packages\\Pythonwin']
>>> sys.path[0] # 獲取第一個搜索路徑
'D:\\test' # 顯示第一個搜索路徑字符串
3、sys.platform
操作系統標識符判斷函數,獲取當前執行環境的平臺,不同系統的標識符如下:
系統 | 標識符 |
---|---|
Windows | win32 |
linux | linux |
MacOS | darwin |
Windows/Cygwin | cygwin |
AIX | aix |
應用舉例:
>>> import sys
>>> print(sys.platform)
win32
可以利用 platform 結合 sys.path 函數實現不同版本模塊文件的導入,如在 Windows 操作系統下導入 Windows 版本的模塊文件和在 Linux 操作系統下導入 Linux 版本的模塊文件,用代碼演示如下:
if sys.platform.startswith('win32'):
print('調用 Windows 版本的模塊文件代碼')
elif sys.platform.startswith('linux'):
print('調用 Linux 版本的模塊文件代碼')
4、sys.getwindowsversion()
返回描述當前運行的 Windows 版本信息的元組
返回的參數有:
參數 | 含義 |
---|---|
major |
主要版本號 |
minor |
次要版本號 |
build |
發佈年月 |
platform |
返回一個數值,代表操作系統產品類型號,不同數值代表含義不同 |
service_pack |
一個字符串 |
service_pack_minor |
\ |
service_pack_major |
\ |
suite_mask |
\ |
product_type |
返回一個數值,代表產品類型,不同數值代表含義不同 |
platform_version |
返回當前操作系統的 major (主要版本號)、minor (次要版本號) 和 build (發佈年月),類型爲一個三元組 |
platform
可能的值及其含義:
常量 | 平臺 |
---|---|
0(VER_PLATFORM_WIN32s) | Windows 3.1上的Win32s |
1(VER_PLATFORM_WIN32_WINDOWS) | Windows 95/98 / ME |
2(VER_PLATFORM_WIN32_NT) | Windows NT / 2000 / XP / x64 |
3(VER_PLATFORM_WIN32_CE) | Windows CE |
product_type
可能的值及其含義:
常量 | 平臺 |
---|---|
1(VER_NT_WORKSTATION) | 代表系統是工作站 |
2(VER_NT_DOMAIN_CONTROLLER) | 代表系統是域控制器 |
3(VER_NT_SERVER) | 代表系統是服務器,但不是域控制器 |
組件也可以按名稱訪問,因此 sys.getwindowsversion()[0]
等同於sys.getwindowsversion().major
,爲了與以前的版本兼容,只有前5個元素可以通過索引檢索。
應用舉例:
>>> import sys
>>> print(sys.getwindowsversion())
sys.getwindowsversion(major=10, minor=0, build=18363, platform=2, service_pack='')
>>>
>>> print(sys.getwindowsversion()[1])
0
>>>
>>> print(sys.getwindowsversion().platform_version)
(10, 0, 18362)
5、sys.version
返回一個字符串,包含 Python 解釋器的版本號以及所用的內部版本號和編譯器的附加信息
應用舉例:
>>> import sys
>>> print(sys.version)
3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
6、sys.exit(n)
程序退出,如果是正常退出是 sys.exit(0)
,可選參數 n 可以是給定退出狀態(默認爲零)的整數,也可以是其他類型的對象。如果是整數,則 0 被認爲是成功終止,任何非零值被 shell 等視爲異常終止。大多數系統要求它在 0 到 127 之間,否則會產生未定義的結果。有些系統有一個爲特定退出代碼指定特定含義的約定,但這些約定通常不是普遍的;Unix 程序通常使用 2 表示命令行語法錯誤,使用 1 表示所有其他類型的錯誤。
應用舉例:
import sys
print('I love python!')
sys.exit(0)
print('I love java!')
運行該程序,輸出 I love python!
後並沒有繼續輸出 I love java!
,因爲在執行到 sys.exit(0)
的時候程序就結束了。
7、sys.modules
sys.modules
可以將模塊名稱映射到已加載的模塊的字典,每當程序員導入新的模塊,sys.modules
將自動記錄該模塊,當第二次再導入該模塊時,Python 會直接到字典中查找,從而加快了程序運行的速度。
sys.modules
模塊擁有字典所擁有的一切方法,可以通過這些方法瞭解當前的環境加載了哪些模塊
應用舉例:
>>> import sys
>>> print(sys.modules['os'])
<module 'os' from 'E:\\Python\\lib\\os.py'>
>>>
>>> print(sys.modules['sys'])
<module 'sys' (built-in)>
>>>
>>> print(sys.modules.values())
>>> dict_values([<module 'builtins' (built-in)>, <module 'sys' (built-in)>, ......, <module 'urllib.parse' from 'E:\\Python\\lib\\urllib\\parse.py'>])
>>>
>>> print(sys.modules.keys())
dict_keys(['builtins', 'sys', '_frozen_importlib', '_imp',......, 'pydoc', 'pkgutil', 'urllib', 'urllib.parse'])
8、sys.stdin / stdout / stderr
解釋器用於標準輸入 (sys.stdin)、輸出 (sys.stdout) 和錯誤 (sys.stderr) 的文件對象。
sys.stdin、sys.stdout 與我們平常使用的 input、print 類似。
Python 在調用 print 時,事實上調用了 sys.stdout.write(obj+'\n')
,用例子來說明(以下兩行代碼等價):
sys.stdout.write('I love python!' + '\n')
print('I love python!')
sys.stdin.readline()
方法會將標準輸入全部獲取,包括末尾的 \n
,使用 len
計算長度時會把換行符 \n
也算進去,而 input()
獲取輸入時返回的結果是不包含末尾的換行符 \n
的,以下舉例說明兩者的區別:
>>> import sys
>>> print(len(sys.stdin.readline()))
hello
6
>>> print(len(input()))
hello
5
可以看到,兩者輸入的字符串都一樣,而長度不一樣,如果使用了 sys.stdin.readline()
方法,想將其換行符去掉的話,可以用 strip()
函數或者直接切片的方法,示例如下:
>>> import sys
>>> print(len(sys.stdin.readline()))
hello
6
>>> print(len(sys.stdin.readline().strip('\n')))
hello
5
>>> print(len(sys.stdin.readline()[:-1]))
hello
5