一、什麼是subprocess模塊
Python的subprocess模塊可以讓我們方便地在Python程序中執行外部命令。如果我們需要在Python中調用其他的應用程序,或者需要在Python中自動化一些系統命令,subprocess模塊就可以派上用場。
簡單地說,subprocess模塊就是一個方便的接口,可以讓我們在Python程序中運行其他操作系統的命令行程序,並且可以控制子進程的輸入輸出和狀態。
二、subprocess模塊的常用函數
subprocess模塊提供了很多函數,這裡介紹其中幾個常用的函數。
1、subprocess.run()
subprocess.run()是Python 3.5引入的一個新函數,它是一個高層次的函數,用於運行一條shell命令並等待其完成。使用該函數可以快速地對外部命令進行調用。
以下代碼展示了如何使用subprocess.run()來運行外部命令。
import subprocess result = subprocess.run(['/bin/ls', '-l'], stdout=subprocess.PIPE) print(result.stdout.decode())
在上面的代碼中,我們用subprocess.run()函數來運行外部命令/bin/ls -l,等待退出,並捕獲標準輸出。subprocess.PIPE指定子進程標準輸出被捕獲,並且可以用stdout屬性訪問。
2、subprocess.call()
subprocess.call()是一個低級別的函數,可以向操作系統調用指定的程序,並等待其退出。調用成功時,返回退出狀態碼,否則返回None。
以下代碼展示了如何使用subprocess.call()來運行外部命令,並等待執行完成。
import subprocess retcode = subprocess.call(['ls', '-l']) print('Returned value:', retcode)
在上面的代碼中,我們在Python程序中使用subprocess.call()來運行外部命令ls -l,等待處理完成,然後輸出返回值。
三、使用subprocess模塊的注意事項
在使用subprocess模塊時,需要注意以下幾點。
1、輸入和輸出
默認情況下,subprocess調用外部命令時是不會獲取到輸出結果的。我們可以使用subprocess.PIPE將子進程的標準輸出捕獲,並使用stdout屬性訪問。
可以使用subprocess.STDOUT標準輸出常量將錯誤輸出重定向到標準輸出中。
2、防止安全漏洞
當傳遞輸入給外部程序時,一定要確保輸入數據是可信的。否則,可能會導致安全漏洞。
如果你需要向程序發送用於文件名或命令行選項的參數,一定要對它們進行適當的轉義處理。使用shlex.quote()來轉義參數。
以下是一個例子,展示了將變量作為外部命令的參數時,為它們進行轉義處理的正確方式。
import subprocess import shlex s = 'hello world' args = shlex.split('grep %s /etc/passwd' % shlex.quote(s)) result = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True) print(result.stdout)
3、手動輸入密碼
當系統命令需要請求輸入密碼時,可以使用subprocess模塊的pty模塊來實現。pty模塊是Python的偽終端模塊,可以模擬終端。
下面是一個例子,演示如何在Python中使用subprocess模塊來手動輸入密碼:
import subprocess import pty import time def input_password(): os.write(1, "Please input your password: ".encode()) # turn off echoing attrs = termios.tcgetattr(fd) attrs[3] = attrs[3] & ~termios.ECHO try: termios.tcsetattr(fd, termios.TCSADRAIN, attrs) password = os.read(fd, 100) os.write(1, '\n'.encode()) finally: attrs[3] = attrs[3] | termios.ECHO termios.tcsetattr(fd, termios.TCSADRAIN, attrs) return password.decode().strip() fd, _ = pty.openpty() child = subprocess.Popen('sudo some_command', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) password = input_password() child.stdin.write((password+'\n').encode()) child.stdin.flush() output, stderr = child.communicate() print(output.decode())
4、多個命令
如果需要在Python中運行多個命令,則需要使用bash,並將需要運行的多個命令傳遞給該bash。
以下是一個使用subprocess調用多個命令的例子。
import subprocess process = subprocess.Popen(['/bin/bash'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) # Run multiple commands process.stdin.write('ls\n'.encode()) process.stdin.write('echo "Hello world"\n'.encode()) output, error = process.communicate() print(output.decode())
四、總結
使用Python subprocess模塊執行外部命令可以方便地調用其他應用程序或自動化一些系統命令。我們介紹了subprocess模塊的常用函數,包括subprocess.run()和subprocess.call()的用法,以及一些使用subprocess的注意事項,如輸入和輸出、防止安全漏洞、手動輸入密碼、多個命令等。
在開發Python應用程序過程中,如有需要,千萬不要忘記使用subprocess模塊的強大功能。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/237857.html