使用subprocess进行svn上传,需要捕获多次cmd实时输出并进行实时输入
时间: 2023-12-24 18:02:50 浏览: 27
可以使用Python的`subprocess`模块实现这个功能。具体步骤如下:
1. 创建一个`Popen`对象,通过该对象启动一个子进程,运行svn命令。
2. 使用`communicate()`方法与子进程进行交互,捕获子进程的标准输出和标准错误输出,并将输入发送给子进程。
3. 在捕获输出时,可以使用`while True:`循环来实时获取输出,直到子进程结束。
下面是一个示例代码:
```python
import subprocess
def svn_upload(svn_path, commit_msg):
cmd = ['svn', 'commit', '-m', commit_msg, svn_path]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
while True:
out = p.stdout.readline().decode()
if out == '' and p.poll() is not None:
break
if out:
print(out.strip())
err = p.stderr.readline().decode()
if err == '' and p.poll() is not None:
break
if err:
print(err.strip())
p.stdin.write(b'\n')
p.stdin.flush()
p.communicate()
```
在这个示例中,我们定义了一个函数`svn_upload`,接受两个参数:`svn_path`表示要上传的svn路径,`commit_msg`表示提交信息。
在函数内部,我们使用`Popen`对象启动一个子进程,运行`svn commit`命令。然后进入一个无限循环,不断读取子进程的标准输出和标准错误输出,直到子进程结束。在读取输出时,我们使用了`decode()`方法将字节串转换为字符串,并使用`strip()`方法去除字符串两端的空白字符。
最后,我们在循环结束后,向子进程发送一个空行,以便让它完成输入操作。然后调用`communicate()`方法等待子进程结束。