if stderr.read() == b'': # 没有发生错误 for line in stdout.readlines(): print(line.strip()) else: print(stderr.read())
时间: 2024-05-30 07:09:54 浏览: 94
这是一个 Python paramiko 库中使用SSH远程执行命令的示例代码。这段代码先判断 `stderr` 是否有输出,如果没有输出则表示命令执行成功,可以通过读取 `stdout` 变量来获取远程命令的输出结果,并逐行打印。如果有错误输出,则直接打印错误输出。
具体来说,`stderr.read()` 方法用于读取远程命令的错误输出,如果错误输出为空,则表示命令执行成功。如果有错误输出,则直接打印输出结果,否则使用 `stdout.readlines()` 方法逐行读取远程命令的标准输出,并使用 `print()` 函数将其打印出来。`strip()` 方法用于去除字符串首尾的空白字符。
需要注意的是,这段代码中对 `stdout` 和 `stderr` 变量都调用了 `read()` 方法,这会将远程命令的输出结果全部读取到内存中,如果输出结果很大,可能会导致内存溢出。如果需要处理大量的远程命令输出,建议使用 `readline()` 或 `readlines()` 方法逐行读取输出结果并处理。
相关问题
stdin, stdout, stderr = coon.exec_command('ls') if stderr.read() == b'': # 没有发生错误 for line in stdout.readlines(): print(line.strip()) else: print(stderr.read())
这段代码是使用Python的Paramiko库来连接SSH服务器,并执行命令。具体流程如下:
1. 使用Paramiko库的SSHClient类来建立SSH连接,如下所示:
```python
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='hostname', port=22, username='username', password='password')
```
2. 使用SSH连接对象的exec_command()方法执行命令,如下所示:
```python
stdin, stdout, stderr = ssh.exec_command('ls')
```
这里执行的是`ls`命令,可以根据需要更改为其他命令。
3. 检查是否有错误发生,如果没有,则读取输出结果并打印,如下所示:
```python
if stderr.read() == b'':
# 没有发生错误
for line in stdout.readlines():
print(line.strip())
```
如果有错误发生,则读取错误信息并打印。
完整代码如下所示:
```python
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname='hostname', port=22, username='username', password='password')
stdin, stdout, stderr = ssh.exec_command('ls')
if stderr.read() == b'':
# 没有发生错误
for line in stdout.readlines():
print(line.strip())
else:
# 发生错误
print(stderr.read())
```
注意,这里需要安装Paramiko库才能运行代码。可以使用以下命令安装:
```shell
pip install paramiko
```
import subprocesswhile True: proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) try: while True: if proc.poll() is not None: break # 读取子进程的输出 output = proc.stdout.readline().decode().strip() if output: print(output) error = proc.stderr.readline().decode().strip() if error: print(error) except KeyboardInterrupt: proc.terminate() break simplest 里面ffpeg推流打印信息没有在终端输出
这个问题可能是因为 `subprocess` 模块的缓冲机制导致的。可以尝试使用 `subprocess.PIPE` 的 `bufsize` 参数来控制缓冲区大小,或者使用 `subprocess.STDOUT` 将标准输出和标准错误输出合并,以便更好地捕捉子进程的输出信息。比如:
```python
import subprocess
while True:
proc = subprocess.Popen(["python3", "/home/pi/Documents/8-17/simplest.py"],
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
try:
while True:
if proc.poll() is not None:
break
# 读取子进程的输出
output = proc.stdout.readline().decode().strip()
if output:
print(output)
proc.wait()
except KeyboardInterrupt:
proc.terminate()
break
```
这里将标准错误输出合并到标准输出中,并使用 `proc.wait()` 等待子进程结束。另外,还可以使用 `universal_newlines=True` 参数将字节流转换为文本流,以便更方便地处理输出。
阅读全文