先举一个Android查询连接设备的命令来看看Python中subprocess.Popen怎么样的写法。用到的命令为 adb devices。
import subprocess
order='adb devices'
pi= subprocess.Popen(order,shell=True,stdout=subprocess.PIPE)
print(pi.stdout.read())
命令的结果返回是一次性的,所以我们用read方法读取数据是没有问题的,然而adb命令里还有一些是实时返回结果的,比如输出手机日志的命令logcat,结果会不断的打印出来当前的设备操作日志信息内容,这种类型的命令我们在Python中如果需要获取打印结果,如果还是用read方法的话,等待结果的返回时间会非常长,这里我们就要换一种方法读取结果,写法如下。
import subprocess
order='adb logcat'
pi= subprocess.Popen(order,shell=True,stdout=subprocess.PIPE)
for i in iter(pi.stdout.readline,'b'):
print(i)
这样的打印效果,如同cmd里操作一致,实时的打印出日志信息。这里我们就用到了readline方法和iter()函数,其实这种写法类似我们读取文件,单行读取和全部内容读取。
执行系统命令,可以获取执行系统命令的结果
p = subprocess.Popen('ps aux',shell=True,stdout=subprocess.PIPE)
out,err = p.communicate()
for line in out.splitlines():
import subprocess
proc = subprocess.Popen([‘python’, ‘test.py’], stdout=subprocess.PIPE)
while 1:
print proc.poll()
#while 1:
print “hello”
print “hello”
测试代码如上,poll函数返回码:
0 正常结束
1 sleep
2 子进程不存在
-15 kill
None 在运行
poll的返回: A None value indicates that the p
正常的 os.system() 执行完后只会返回个执行状态值,返回的 0 表示执行成功,1 表示执行失败。
如果想要获取到执行后的结果集,就需要用到管道命令 os.popen(),然后用 read() 方法可以读到返回的结果。subprocess.Popen() 命令也可以获取返回的结果。
os.system() 方法获取命令返回结果演示。
subprocess.Popen() 方法获取命令返回结果演示。
windows下python subprocess.Popen执行adb 命令进程无法终止
logcmd = "adb logcat -v time > C:/log.txt"
self.Popen = subprocess.Popen(logcmd,stdout = subprocess.PIPE,shell=True)
用上面的方法来获取logcat的信息,它的实际原理是另外开启一个cmd命令来运行adb logcat的命令,即使后面用popen.terminate()也只能关闭cmd的命.
subprocess 模块允许我们启动一个新进程,并连接到它们的输入/输出/错误管道,从而获取返回值。
Popen 是 subprocess的核心,子进程的创建和管理都靠它处理。
subprocess.Popen
subprocess模块定义了一个类: Popen
class Popen(object):
""" Execute a child program in a new process.
For a complete description of the arguments
使用subprocess模块,本模块为开辟子进程去执行子程序提供了统一的接口
process = subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output, unused_err = process.communicate(timeout=3
python 中 subprocess.Popen 总结
subprocess的目的就是启动一个新的进程并且与之通信。
subprocess模块中只定义了一个类: Popen。可以使用Popen来创建进程,并与进程进行复杂的交互。它的构造函数如下:
subprocess.Popen(args,
bufsize=0,
executable=None,
stdin=None,
# 执行 Studio 3T 命令并连接 MongoDB
subprocess.Popen([studio3t_command, "--eval", f"connect('{mongodb_uri}')"])
在上面的代码中,我们首先定义了 Studio 3T 命令和连接 MongoDB 的 URI。然后,我们使用 `subprocess.Popen` 执行 Studio 3T 命令,并使用 `--eval` 参数传递一个连接 MongoDB 的脚本。这个脚本使用了 MongoDB 的 `connect` 方法来连接到指定 URI。
当你运行上面的代码时,它会打开 Studio 3T 并自动连接到 MongoDB。你可以根据需要修改 MongoDB 的 URI 来连接到不同的数据库。