Python中的os系統與subprocess模塊:執行命令與子進程控制

一、os系統模塊

Python內置了os系統模塊,可以用於執行與操作系統相關的命令,如文件操作、進程管理、環境變量等。其中,os.system()是最為基礎和常用的函數,可以幫助我們執行Linux命令。

下面是os.system()的示例代碼:

import os

os.system('echo "hello world"')

在Linux終端下執行上述代碼,結果為:

hello world

可以看到,os.system()可以幫助我們在Python腳本中執行Linux命令,並且可以獲得Linux命令的輸出結果。但是,它的缺點也非常明顯:它無法獲得Linux命令的返回值,因此無法判斷命令是否執行成功。

二、subprocess模塊

subprocess模塊是Python中關於子進程的模塊,可以幫助我們更加靈活地調用系統命令,並且能夠獲取到命令執行的返回值。

下面是subprocess模塊的示例代碼:

import subprocess

cmd = 'echo "hello world"'
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
status = p.returncode

print("stdout: ", stdout)
print("stderr: ", stderr)
print("status: ", status)

運行上述代碼,輸出結果為:

stdout:  b'hello world\n'
stderr:  b''
status:  0

可以看到,我們使用subprocess.Popen()函數幫助我們執行了Linux命令,並獲取到了Linux的輸出結果、錯誤信息和返回值。其中,Popen()函數支持多種參數,比如:

  • shell參數:用於控制是否啟用shell
  • stdin、stdout、stderr參數:用於控制輸入輸出的類型和流程
  • timeout參數:用於控制執行命令的超時時間

三、subprocess模塊的高級應用

除了上述基礎的使用方式,subprocess模塊還支持許多高級特性,比如:

  • 支持管道操作
  • 支持工作目錄切換
  • 支持環境變量的設置
  • 支持文件描述符的傳遞
  • 支持捕獲子進程信號

下面是示例代碼,用於展示subprocess模塊的高級特性:

import os
import subprocess

# 管道操作
cmd1 = 'echo "hello" | sed s/hello/hi/g'
p1 = subprocess.Popen(cmd1, shell=True)
p1.wait()

# 工作目錄切換
os.chdir('/tmp')
cmd2 = 'pwd'
p2 = subprocess.Popen(cmd2, shell=True, stdout=subprocess.PIPE)
stdout, _ = p2.communicate()
print("cwd: ", stdout.strip())

# 環境變量的設置
env = os.environ.copy()
env['PATH'] = env['PATH'] + ':/usr/local/bin'
cmd3 = 'echo $PATH'
p3 = subprocess.Popen(cmd3, shell=True, env=env, stdout=subprocess.PIPE)
stdout, _ = p3.communicate()
print("PATH: ", stdout.strip())

# 文件描述符傳遞
cmd4 = 'ls'
p4 = subprocess.Popen(cmd4, shell=True, stdout=subprocess.PIPE)
with open('/tmp/ls.txt', 'wb') as f:
    f.write(p4.stdout.read())

# 捕獲子進程信號
def on_signal(signum, frame):
    print("Received signal ", signum)

cmd5 = 'sleep 10'
p5 = subprocess.Popen(cmd5, shell=True)
signal.signal(signal.SIGTERM, on_signal)
time.sleep(1)
p5.terminate()

總的來說,subprocess模塊是Python中一個非常強大的系統模塊,參考官方文檔使用時請一定要注意各種參數的使用規則,以及與其他模塊的配合使用。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/254075.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 17:40
下一篇 2024-12-14 17:40

相關推薦

發表回復

登錄後才能評論