做爲一門腳本語言,寫腳本時執行系統命令能夠說很常見了,python提供了相關的模塊和方法。html
os模塊提供了訪問操做系統服務的功能,因爲涉及到操做系統,它包含的內容比較多,這裏只說system和popen方法。python
>>> 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']
>>> help(os.system) Help on built-in function system in module nt: system(command) Execute the command in a subshell.
從字面意思上看,os.system()是在當前進程中打開一個子shell(子進程)來執行系統命令。shell
官方說法:app
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模塊來生成新進程並獲取結果是更好的選擇。dom
>>> os.system('ls') access.log douban.py mail.py myapp.py polipo proxychains __pycache__ spider.py test.py users.txt 0
>>> 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設備,它是行緩衝;對於其它文件,它是全緩衝。ide
官方說法:ui
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()方法。this
>>> 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'>
讀取執行結果:spa
>>> 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']
參考:
https://docs.python.org/3/library/os.html#os.system
https://docs.python.org/3/library/os.html#os.popen操作系統
轉自https://www.cnblogs.com/keithtt/p/7709445.html