如何读取终端输出(ubuntu mate) [英] How do I read terminal output (ubuntu mate)

查看:96
本文介绍了如何读取终端输出(ubuntu mate)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谢谢!



我想知道如何在ubuntu伙伴中阅读终端输出。我的蟒蛇技能仍然非常有限。



让它变得非常容易,所以我将不知道,样品:



Testing.py

-------------------

numbers = 0

而数字< 10:

打印(测试阅读)

数字+ = 1

------------- ------



如何用另一个脚本读取这个输出?



为什么另一个?我有一个我不理解的代码,但我仍然需要从中获取数据并将其存储到文件中。对于一些超酷的家伙/女孩这里是代码,如果你想告诉我如何将数据存储到文件:



它所做的只是读取USB输入和将可能的数据打印到终端。我不正确理解代码所以我无法让它工作。



非常感谢您的帮助!





#!/ usr / bin / python

#编码:UTF-8



################################################## #########################

#(C)Tokyo Cosmos Electric,Inc。(TOCOS) - 保留所有权利。

#利用条件:

# - 本ソースコードは,别途ソースコードライセンス记述が无い限り东京コスモス电机が著作をを

#保有しています。

# - 本ソースコードは,无保证·无サポートです。本ソースコードや生成物を用いたいかなる损害

#についても东京コスモス电机は保证致しません。不具合等の报告は歓迎いたします。

# - 本ソースコードは,东京コスモス电机が贩すするTWEシリーズと共に実行する前提で公开
#しています。

############################## #############################################



### TWE-Lite标准アプリケーションを読み·书きするスクリプト

#[読み]

#シリアルポートから出力される:?? 81 ????データを読みだし,内容を解釈します。

#[书き]

#标准入力に対し1行入力します。

#q [Enter] - >终了

#:?????? [Enter] - > :コマンドの出力



来自串口进口*

来自sys import stdout,stdin,stderr,exit

导入线程



#global変数の定义

ser =无#シリアルポート

t1 =无#読み出しスレッド

bTerm =假#终了フラグ



#その他のメッセージの表示(ペイロードをそのま出日)

def printPayload(l):

if len(l)< 3:返回False#データサイズのチェック



print(command = 0x%02x(other)%l [1])

打印(src = 0x%02x%l [0])



#ペイロードをそのまま出力する

print(payload =,)

for c in l [2:]:

print(%02x%c,)

print( (hex))

返回True



#0x81メッセージの解釈と表示

def printPayload_0x81(l ):

if len(l)!= 23:return False#データサイズのチェック



ladr = l [5]< < 24 | l [6]<< 16 | l [7]<< 8 | l [8]

print(command = 0x%02x(数据到达)%l [1])

print(src = 0x%02x%l [0])

打印(src long = 0x%08x%ladr)

print(dst = 0x%02x%l [9])

print(pktid = 0x%02x%l [2])

print(prtcl ver = 0x%02x%l [3])

print(LQI =%d /% .2f [dbm]%(l [4],(7 * l [4] -1970)/ 20。))

ts = l [10]<< 8 | l [11]

print(time stmp =%。3f [s]%(ts / 64.0))

print(relay flg =%d% l [12])

vlt = l [13]<< 8 | l [14]

打印(volt =%04d [mV]%vlt)



#DI1..4のデータ

dibm = l [16]

dibm_chg = l [17]

di = {}#现在の状态

di_chg = {}#一度でもLo(1)になったら1

for i in range(1,5):

di [i] = 0 if(0) dibm&0x1)== 0 else 1

di_chg [i] = 0 if(dibm_chg&0x1)== 0 else 1

dibm>> = 1

dibm_chg>> = 1



print(DI1 =%d /%d DI2 =%d /%d DI3 =% d /%d DI4 =%d /%d%(di [1],di_chg [1],di [2],di_chg [2],di [3],di_chg [3],di [4],di_chg [4]))



#AD1..4のデータ

ad = {}

er = l [22]

for i in range(1,5):

av = l [i + 18 - 1]

if av == 0xFF:

#ADポートが未使用扱い(おおむね2V以)なら-1

ad [i] = -1 < br $> b $ b否则:

#补正ビットを含めた计算

ad [i] =((av * 4)+(呃&0x3)) * 4

er>> = 2

print(AD1 =%04d AD2 =%04d AD3 =%04d AD4 =%04d [mV]%( ad [1],ad [2],ad [3],ad [4]))



返回True



#シリアルポートからのデータを1行つつ解釈するスレッド

def readThread():

global ser,bTerm

同时为真:

如果bTerm:返回#终了处理

line = ser.readline()。rstrip()#1ライン単位で読み出し,末尾の改行コードを削除(ブロッキング読み出し)



bCommand = False

bStr = False



如果len(线)> 0:

c =行[0]

如果isinstance(c,str):

如果c ==':':bCommand = True

bStr =真

否则:

#python3では字节型になる

如果c == 58: bCommand = True



打印(\ n%s%行)



如果不是bCommand :继续



试试:

lst = {}

如果bStr:

#for Python2.7

lst = map(ord,line [1:]。decode('hex'))#HEX文字列を文字列にデコード后,各々ord()したリスト(列表)に変换

else:
$ 3 $ b#for Python3

导入编解码器

s = line [1:] .decode(ascii)#bytes - > str変换

lst = codecs.decode(s,hex_codec)#hex_codecでバイト列に変换(字节)



csum = sum(lst)&0xff#チェックサムは8bit计算で全部足して0ならOK

lst = lst [0:len(lst)-1]#チェックサムをリストから削除(python3ではpopが使えない)

如果csum == 0:

如果lst [1] == 0x81:

printPayload_0x81(lst)#IO关连のデータの受信

else:

printPayload(lst)#その他のデータ受信

else:

print(checksum ng)

除外:

if len(line)> 0:

打印(...跳过(%s)%行)#エラー时



#终了处理
def DoTerminate():

全球t1,bTerm



#スレッドの停止

bTerm = True



打印(...退出)

time.sleep(0.5)#スリープでスレッドの终了待ちをする



退出(0)



#主处理

if __name__ =='__ main__':

#パラメータの确认

#第一引数:シリアルポート名

if len(sys.argv)! = 2:

打印(%s {串口名称}%sys.argv [0])

退出(1)



#シリアルポートを开く

试试:

ser = Serial(sys.argv [1],115200,timeout = 0.1)

print(打开串口:%s%sys.argv [1])

除外:

pri nt(无法打开串口:%s%sys.argv [1])

退出(1)



#読み出しスレッドの开始

t1 = threading.Thread(target = readThread)

t1.setDaemon(True)

t1.start()



#stdinからの入力处理

而True:

试试:

#标准入力から1行読みだす

l = stdin.readline()。rstrip()



if len(l)> 0:

如果l [0] =='q':#qを入力すると终了

DoTerminate()



如果l [0] ==':':#:からの系列はそのままコマンドの送信

cmd = l +\\\\ n

打印( - >+ l)

ser.write(cmd)

除KeyboardInterrupt外:#Ctrl + C

DoTerminate()

除了SystemExit:

退出(0)

除了:

#例外発生时には终了

打印(......检测到未知异常)

休息



#念のため

exit(0)

解决方案

听起来像是需要管道。管道接受程序的标准输出并将其传递给另一个程序的标准输入。

例如

 ls | grep abc 

将列出当前目录(ls)中的文件并通过grep传递它们,grep将传递给包含字符串'abc'的标准输出行。您可以找到许多使用管道的示例


Hi and Thank You!

I would like to know how to read terminal output in ubuntu mate. My python skills are still very very limited.

Let's make it very easy so I will undestand, SAMPLE:

Testing.py
-------------------
numbers = 0
while numbers < 10:
print ("Testing reading")
numbers += 1
-------------------

how do I read this output with ANOTHER script?

Why another? I have a code I dont understand but I still need to get the data from it and store it to a file. For some super cool guys/girls here is the code if You want to tell me how to store the data to a file:

All it does is read USB input and prints the possible data to terminal. I dont understand the code properly so I couldn't get it to work.

Thanks alot for any help!


#!/usr/bin/python
# coding: UTF-8

###########################################################################
# (C) Tokyo Cosmos Electric, Inc. (TOCOS) - all rights reserved.
# 利用条件:
# - 本ソースコードは、別途ソースコードライセンス記述が無い限り東京コスモス電機が著作権を
# 保有しています。
# - 本ソースコードは、無保証・無サポートです。本ソースコードや生成物を用いたいかなる損害
# についても東京コスモス電機は保証致しません。不具合等の報告は歓迎いたします。
# - 本ソースコードは、東京コスモス電機が販売する TWE シリーズと共に実行する前提で公開
# しています。
###########################################################################

### TWE-Lite 標準アプリケーションを読み・書きするスクリプト
# [読み]
# シリアルポートから出力される :??81???? データを読みだし、内容を解釈します。
# [書き]
# 標準入力に対し1行入力します。
# q[Enter] --> 終了
# :??????[Enter] --> : コマンドの出力

from serial import *
from sys import stdout, stdin, stderr, exit
import threading

# global 変数の定義
ser = None # シリアルポート
t1 = None # 読み出しスレッド
bTerm = False # 終了フラグ

# その他のメッセージの表示 (ペイロードをそのまま出力)
def printPayload(l):
if len(l) < 3: return False # データサイズのチェック

print (" command = 0x%02x (other)" % l[1])
print (" src = 0x%02x" % l[0])

# ペイロードをそのまま出力する
print (" payload =",)
for c in l[2:]:
print ("%02x" % c,)
print ("(hex)")
return True

# 0x81 メッセージの解釈と表示
def printPayload_0x81(l):
if len(l) != 23: return False # データサイズのチェック

ladr = l[5] << 24 | l[6] << 16 | l[7] << 8 | l[8]
print (" command = 0x%02x (data arrival)" % l[1])
print (" src = 0x%02x" % l[0])
print (" src long = 0x%08x" % ladr)
print (" dst = 0x%02x" % l[9])
print (" pktid = 0x%02x" % l[2])
print (" prtcl ver = 0x%02x" % l[3])
print (" LQI = %d / %.2f [dbm]" % (l[4], (7*l[4]-1970)/20.))
ts = l[10] << 8 | l[11]
print (" time stmp = %.3f [s]" % (ts / 64.0))
print (" relay flg = %d" % l[12])
vlt = l[13] << 8 | l[14]
print (" volt = %04d [mV]" % vlt)

# DI1..4 のデータ
dibm = l[16]
dibm_chg = l[17]
di = {} # 現在の状態
di_chg = {} # 一度でもLo(1)になったら1
for i in range(1,5):
di[i] = 0 if (dibm & 0x1) == 0 else 1
di_chg[i] = 0 if (dibm_chg & 0x1) == 0 else 1
dibm >>= 1
dibm_chg >>= 1

print (" DI1=%d/%d DI2=%d/%d DI3=%d/%d DI4=%d/%d" % (di[1], di_chg[1], di[2], di_chg[2], di[3], di_chg[3], di[4], di_chg[4]))

# AD1..4 のデータ
ad = {}
er = l[22]
for i in range(1,5):
av = l[i + 18 - 1]
if av == 0xFF:
# ADポートが未使用扱い(おおむね2V以)なら -1
ad[i] = -1
else:
# 補正ビットを含めた計算
ad[i] = ((av * 4) + (er & 0x3)) * 4
er >>= 2
print (" AD1=%04d AD2=%04d AD3=%04d AD4=%04d [mV]" % (ad[1], ad[2], ad[3], ad[4]))

return True

# シリアルポートからのデータを1行ずつ解釈するスレッド
def readThread():
global ser, bTerm
while True:
if bTerm: return # 終了処理
line = ser.readline().rstrip() # 1ライン単位で読み出し、末尾の改行コードを削除(ブロッキング読み出し)

bCommand = False
bStr = False

if len(line) > 0:
c = line[0]
if isinstance(c, str):
if c == ':': bCommand = True
bStr = True
else:
# python3 では bytes 型になる
if c == 58: bCommand = True

print ("\n%s" % line)

if not bCommand: continue

try:
lst = {}
if bStr:
# for Python2.7
lst = map(ord, line[1:].decode('hex')) # HEX文字列を文字列にデコード後、各々 ord() したリスト(list)に変換
else:
# for Python3
import codecs
s = line[1:].decode("ascii") # bytes -> str 変換
lst = codecs.decode(s, "hex_codec") # hex_codec でバイト列に変換 (bytes)

csum = sum(lst) & 0xff # チェックサムは 8bit 計算で全部足して 0 なら OK
lst = lst[0:len(lst)-1] # チェックサムをリストから削除 (python3ではpopが使えない)
if csum == 0:
if lst[1] == 0x81:
printPayload_0x81(lst) # IO関連のデータの受信
else:
printPayload(lst) # その他のデータ受信
else:
print ("checksum ng")
except:
if len(line) > 0:
print ("...skip (%s)" % line) # エラー時

# 終了処理
def DoTerminate():
global t1, bTerm

# スレッドの停止
bTerm = True

print ("... quitting")
time.sleep(0.5) # スリープでスレッドの終了待ちをする

exit(0)

# 主処理
if __name__=='__main__':
# パラメータの確認
# 第一引数: シリアルポート名
if len(sys.argv) != 2:
print ("%s {serial port name}" % sys.argv[0])
exit(1)

# シリアルポートを開く
try:
ser = Serial(sys.argv[1], 115200, timeout=0.1)
print ("open serial port: %s" % sys.argv[1])
except:
print ("cannot open serial port: %s" % sys.argv[1])
exit(1)

# 読み出しスレッドの開始
t1=threading.Thread(target=readThread)
t1.setDaemon(True)
t1.start()

# stdin からの入力処理
while True:
try:
# 標準入力から1行読みだす
l = stdin.readline().rstrip()

if len(l) > 0:
if l[0] == 'q': # q を入力すると終了
DoTerminate()

if l[0] == ':': # :からの系列はそのままコマンドの送信
cmd = l + "\r\n"
print ("--> "+ l)
ser.write(cmd)
except KeyboardInterrupt: # Ctrl+C
DoTerminate()
except SystemExit:
exit(0)
except:
# 例外発生時には終了
print ("... unknown exception detected")
break

# 念のため
exit(0)

解决方案

Sounds like you need a pipe. A pipe takes the standard output of a program and passes it to the standrard input of another.
for example

ls | grep abc

will list the files in the current directory (ls) and pass them through grep, which will pass to its standard output lines containing the string 'abc'.You can find lots of example of using pipes.


这篇关于如何读取终端输出(ubuntu mate)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆