数据流 python subprocess.check_output 从其他位置执行

0 投票
1 回答
921 浏览
提问于 2025-04-18 11:34

我想从这个目录运行一个exe文件:/home/pi/pi_sensors-master/bin/Release/。

这个exe文件是通过输入命令mono i2c.exe来运行的,运行得很好。

我希望能在一个完全不同的目录里用Python获取这个输出。

我知道应该使用subprocess.check_output来把输出作为字符串获取。

我尝试在Python中实现这个:

import subprocess
import os


cmd = "/home/pi/pi_sensors-master/bin/Release/"
os.chdir(cmd)
process=subprocess.check_output(['mono i2c.exe'])
print process

但是,我收到了这个错误:

在这里输入图片描述

这个输出通常是一个数据流,每次都会有一个新的数字,是否可以捕获这个输出并将其存储为一个不断变化的变量呢?

任何帮助都将非常感激。

1 个回答

2

你的命令写错了,这实际上导致了错误的发生。你想要运行的是 mono i2c.exe,所以你的命令应该像这样:

subprocess.check_output(['mono', 'i2c.exe']) # Notice the comma separation.

试试下面这个:

import subprocess
import os

executable = "/home/pi/pi_sensors-master/bin/Release/i2c.exe"

print subprocess.check_output(['mono', executable])

使用 sudo 不是问题,只要你提供文件的完整路径,并且确认以 sudo 运行 mono 命令是有效的。

我也可以通过执行 ls -l 来产生同样的错误:

>>> subprocess.check_output(['ls -l'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 537, in check_output
    process = Popen(stdout=PIPE, *popenargs, **kwargs)
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

但是当你把命令和选项分开时:

>>> subprocess.check_output(['ls', '-l'])
# outputs my entire folder contents which are quite large.

我强烈建议你使用 subprocess.Popen 对外部进程进行处理。使用 Popen.communicate() 来获取 stdoutstderr 的数据。这样你就不会遇到阻塞的问题。

import os
import subprocess

executable = "/home/pi/pi_sensors-master/bin/Release/i2c.exe"
proc = subprocess.Popen(['mono', executable])

try:
    outs, errs = proc.communicate(timeout=15) # Times out after 15 seconds.
except TimeoutExpired:
    proc.kill()
    outs, errs = proc.communicate()

或者如果你想要一种“数据流”的效果,可以在循环中调用 communicate,这是一个相关问题的回答

from subprocess import Popen, PIPE

executable = "/home/pi/pi_sensors-master/bin/Release/i2c.exe"
p = Popen(["mono", executable], stdout=PIPE, bufsize=1)
for line in iter(p.stdout.readline, b''):
    print line,
p.communicate() # close p.stdout, wait for the subprocess to exit

撰写回答