1. 程式人生 > 程式設計 >Python呼叫系統命令os.system()和os.popen()的實現

Python呼叫系統命令os.system()和os.popen()的實現

作為一門指令碼語言,寫指令碼時執行系統命令可以說很常見了,python提供了相關的模組和方法。

os模組提供了訪問作業系統服務的功能,由於涉及到作業系統,它包含的內容比較多,這裡只說system和popen方法。

>>> import os
>>> dir(os)
['DirEntry','F_OK','MutableMapping','O_APPEND','O_BINARY','O_CREAT','O_EXCL','O_NOINHERIT','O_RANDOM','O_RDONLY','O_RDWR','O_SEQUENTIAL','O_SHORT_LIVED','O_TEMPORARY','O_TEXT','O_TRUNC','O_WRONLY','P_DETACH','P_NOWAIT','P_NOWAITO','P_OVERLAY','P_WAIT','PathLike','R_OK','SEEK_CUR','SEEK_END','SEEK_SET','TMP_MAX','W_OK','X_OK','_Environ','__all__','__builtins__','__cached__','__doc__','__file__','__loader__','__name__','__package__','__spec__','_execvpe','_exists','_exit','_fspath','_get_exports_list','_putenv','_unsetenv','_wrap_close','abc','abort','access','altsep','chdir','chmod','close','closerange','cpu_count','curdir','defpath','device_encoding','devnull','dup','dup2','environ','errno','error','execl','execle','execlp','execlpe','execv','execve','execvp','execvpe','extsep','fdopen','fsdecode','fsencode','fspath','fstat','fsync','ftruncate','get_exec_path','get_handle_inheritable','get_inheritable','get_terminal_size','getcwd','getcwdb','getenv','getlogin','getpid','getppid','isatty','kill','linesep','link','listdir','lseek','lstat','makedirs','mkdir','name','open','pardir','path','pathsep','pipe','popen','putenv','read','readlink','remove','removedirs','rename','renames','replace','rmdir','scandir','sep','set_handle_inheritable','set_inheritable','spawnl','spawnle','spawnv','spawnve','st','startfile','stat','stat_float_times','stat_result','statvfs_result','strerror','supports_bytes_environ','supports_dir_fd','supports_effective_ids','supports_fd','supports_follow_symlinks','symlink','sys','system','terminal_size','times','times_result','truncate','umask','uname_result','unlink','urandom','utime','waitpid','walk','write']

os.system()

>>> help(os.system)
Help on built-in function system in module nt:

 
system(command)
  Execute the command in a subshell.

從字面意思上看,os.system()是在當前程序中開啟一個子shell(子程序)來執行系統命令。

官方說法:

On Unix,the return value is the exit status of the process encoded in the format specified for wait().

The subprocess module provides more powerful facilities for spawning new processes and retrieving their results; using that module is preferable to using this function.

這個方法只返回狀態碼,執行結果會輸出到stdout,也就是輸出到終端。不過官方建議使用subprocess模組來生成新程序並獲取結果是更好的選擇。

>>> os.system('ls')
access.log douban.py mail.py myapp.py polipo proxychains __pycache__  spider.py test.py users.txt
0

os.popen()

>>> help(os.popen)
Help on function popen in module os:

popen(cmd,mode='r',buffering=-1)
  # Supply os.popen()

cmd:要執行的命令。
mode:開啟檔案的模式,預設為'r',用法與open()相同。
buffering:0意味著無緩衝;1意味著行緩衝;其它正值表示使用引數大小的緩衝。負的bufsize意味著使用系統的預設值,一般來說,對於tty裝置,它是行緩衝;對於其它檔案,它是全緩衝。

官方說法:

Open a pipe to or from command cmd. The return value is an open file object connected to the pipe,which can be read or written depending on whether mode is 'r' (default) or 'w'.

The close method returns None if the subprocess exited successfully,or the subprocess's return code if there was an error.

This is implemented using subprocess.Popen;

這個方法會開啟一個管道,返回結果是一個連線管道的檔案物件,該檔案物件的操作方法同open(),可以從該檔案物件中讀取返回結果。如果執行成功,不會返回狀態碼,如果執行失敗,則會將錯誤資訊輸出到stdout,並返回一個空字串。這裡官方也表示subprocess模組已經實現了更為強大的subprocess.Popen()方法。

>>> os.popen('ls')
<os._wrap_close object at 0x7f93c5a2d780>
>>> os.popen('la')
<os._wrap_close object at 0x7f93c5a37588>
>>> /bin/sh: la: command not found

>>> f = os.popen('ls')
>>> type(f)
<class 'os._wrap_close'>

讀取執行結果:

>>> f.readlines()
['access.log\n','douban.py\n','import_test.py\n','mail.py\n','myapp.py\n','polipo\n','proxychains\n','__pycache__\n','spider.py\n','test.py\n','users.txt\n']

這裡使用os.popen來獲取裝置號,使用os.system來啟動macaca服務(有時間了將macaca的一些經歷寫寫吧)。

兩者的區別是:

(1)os.system(cmd)的返回值只會有0(成功),1,2

(2)os.popen(cmd)會把執行的cmd的輸出作為值返回。

參考:

https://docs.python.org/3/library/os.html#os.system
https://docs.python.org/3/library/os.html#os.popen

到此這篇關於Python呼叫系統命令os.system()和os.popen()的實現的文章就介紹到這了,更多相關Python os.system()和os.popen()內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!