欢迎访问宙启技术站
智能推送

在Python中使用commands模块执行系统命令并实现进程间通信

发布时间:2024-01-16 18:00:21

在Python中,我们可以使用subprocess模块来执行系统命令,并实现进程间的通信。subprocess模块相较于commands模块更加强大和灵活,因此在Python 2.6及之后的版本中,commands模块已经被弃用。

下面是一个使用subprocess模块执行系统命令并实现进程间通信的例子。

import subprocess

# 执行系统命令,并返回输出结果
def execute_command(command):
    # 执行命令,并捕获标准输出和错误输出
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
    output, error = process.communicate()
    return output, error

# 示例:执行ls命令,并获取输出结果
output, error = execute_command("ls")
print(output.decode())  # 输出命令的结果

# 示例:执行cat命令,并通过管道传递内容给grep命令进行过滤
content = "Hello, world!"
command = "echo '{}' | grep 'world'".format(content)
output, error = execute_command(command)
print(output.decode())  # 输出命令的结果,如果内容中包含'world'则会包含该行,否则为空

# 示例:执行一个长时间运行的命令,并实时获取输出
command = "ping www.google.com"
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
while True:
    output = process.stdout.readline()
    if output == b'' and process.poll() is not None:
        break
    if output:
        print(output.decode())

# 示例:执行一个命令,并获取其返回码
command = "ls /not/exist"
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
output, error = process.communicate()
return_code = process.returncode
print(return_code)  # 输出命令的返回码

在上述例子中,我们通过subprocess.Popen()函数执行系统命令。该函数的 个参数是要执行的命令,可以是一个字符串或一个字符串列表。stdout参数用于指定标准输出的处理方式,可以是subprocess.PIPE用于捕获输出,也可以是一个自定义的文件对象用于重定向输出。stderr参数用于指定错误输出的处理方式,同样可以是subprocess.PIPE或一个文件对象。shell参数指示命令是否通过shell去执行,默认为False。

在执行命令后,我们可以使用communicate()方法来获取命令的输出和错误输出。如果命令执行成功,communicate()方法会返回一个元组,其中 个元素是输出的内容(如果存在),第二个元素是错误输出的内容(如果存在)。如果出现错误,communicate()方法将会抛出一个OSError异常。

除了communicate()方法,我们还可以通过stdout.readline()方法来实时获取命令的输出。在一个循环中,我们不断读取输出的行,直到输出为空并且命令执行完毕。

另外,subprocess.Popen对象还有一个returncode属性,用于获取命令的返回码。

需要注意的是,在执行系统命令时,应尽量避免直接传入用户输入的内容,以防止命令注入等安全问题的发生。在将用户输入作为命令的一部分时,建议使用subprocess.list2cmdline()函数将字符串列表转换为一个适合执行的命令字符串。