数据流 python subprocess.check_output 从其他位置执行
我想从这个目录运行一个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()
来获取 stdout
和 stderr
的数据。这样你就不会遇到阻塞的问题。
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