python调用Shell脚本:os.system(cmd)或os.popen(cmd)的区别

本文探讨了Python中os.popen与os.system两种方法的不同之处。os.system用于执行shell命令并返回状态码,而os.popen则通过管道读取命令的输出。文章通过实例解释了如何使用这两种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近需要用到os.system 发现不能赋值到变量

后查有更新的模块,如下: 
os.system 
os.spawn* 
os.popen* 
popen2.* 
commands.*

重新使用content=os.popen(‘help’).read() 
就能获取到了


两者的区别是:

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

 os.popen(cmd)会吧执行的cmd的输出作为值返回。

 

python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。

现假定有一个shell脚本test.sh:

#!/bin/bash

1. echo "hello world!"

2. exit 3

os.system(cmd):

该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中“exit 1”的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0×100,换算为10进制得到256。

如果我们需要获得os.system的正确返回值,那使用位移运算可以还原返回值:

1. >>>  n = os.system(test.sh)

2. >>> n >> 8

3. >>> 3

os.popen(cmd):

这种调用方式是通过管道的方式来实现,函数返回一个file-like的对象,里面的内容是脚本输出的内容(可简单理解为echo输出的内容)。使用os.popen调用test.sh的情况:
python调用Shell脚本,有两种方法:os.system(cmd)或os.popen(cmd),前者返回值是脚本的退出状态码,后者的返回值是脚本执行过程中的输出内容。实际使用时视需求情况而选择。

明显地,像调用”ls”这样的shell命令,应该使用popen的方法来获得内容



以前就疑惑popen和system有什么不同,今天实际的应用,才让我恍然大悟
os.popen()可以实现一个“管道”,从这个命令获取的值可以继续被调用。而os.system不同,它只是调用,调用完后自身退出,可能返回个0吧

比如,我想得到ntpd的进程id,就要这么做:
os.popen('ps -C ntpd | grep -v CMD |awk '{ print $1 }').readlines()[0]


<think>我们正在讨论如何在Python中使用os.system来执行CMD命令。根据用户的问题,他想要了解具体的用法。 根据引用[1]和[2],我们知道os.system()Python中用于执行系统命令的一个函数。它接收一个字符串参数,即要执行的命令,然后执行该命令并返回命令的退出状态(0通常表示成功)。 步骤: 1. 导入os模块。 2. 使用os.system("command"),其中command是你要在CMD中执行的命令。 注意:这个函数会阻塞当前进程直到命令执行完成。另外,命令执行的结果会直接输出到控制台,而不会作为返回值。返回值是命令执行后的退出状态(一个整数)。 示例:执行一个简单的dir命令(在Windows中列出当前目录的内容) 但是,用户提到的是CMD命令,所以我们应该以Windows命令为例。 另外,引用中提到了os.popen(),它也可以执行命令,但是它会返回一个文件对象,通过这个文件对象可以读取命令执行的输出。如果用户需要获取命令的输出,那么可以使用os.popen()。 不过,用户的问题明确要求使用os.system,所以我们重点介绍os.system。 我们写一个简单的示例代码:</think>### Python中使用`os.system()`调用CMD命令 在Python中,`os.system()`函数允许直接执行操作系统的CMD命令。其基本用法如下: ```python import os # 执行CMD命令 exit_code = os.system("命令字符串") ``` #### 关键特性: 1. **返回值**:返回命令的退出状态码(0表示成功,非0表示错误) 2. **执行环境**:命令在系统默认shell中执行(Windows为CMD,Linux/Mac为Bash) 3. **同步执行**:程序会阻塞直到命令执行完成 4. **输出处理**:命令输出直接显示在控制台,无法直接捕获到Python变量 #### 使用示例: ```python import os # 创建目录 os.system("mkdir new_folder") # Windows: md new_folder # 查看文件列表 os.system("dir") # Linux/Mac: ls # 运行Python脚本 os.system("python other_script.py") # 带参数的命令 os.system('echo "Hello from CMD" > output.txt') ``` #### 注意事项: 1. **路径处理**:建议使用原始字符串双反斜杠 ```python os.system(r"cd C:\Users\test") # 正确 os.system("cd C:\\Users\\test") # 正确 ``` 2. **命令注入风险**:避免直接拼接用户输入 ```python # 危险示例(命令注入漏洞) user_input = "hello & del *.*" os.system(f"echo {user_input}") # 可能执行恶意命令 ``` 3. **跨平台差异**: - Windows命令:`dir`, `copy`, `del` - Linux/Mac命令:`ls`, `cp`, `rm` #### 替代方案(需捕获输出时): ```python # 使用os.popen()获取命令输出 output = os.popen("systeminfo").read() print(output) # 推荐使用subprocess模块 import subprocess result = subprocess.run(["cmd", "/c", "dir"], capture_output=True, text=True) print(result.stdout) ``` > 提示:对于需要捕获输出复杂命令交互的场景,建议使用更强大的`subprocess`模块[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值