【问题标题】:grab serial input line and move them to a shell script抓取串行输入行并将它们移动到 shell 脚本
【发布时间】:2016-07-25 03:47:08
【问题描述】:

我尝试获取一个 uart - 线并将这个字符串提供给一个 shell 脚本;

#!/usr/bin/env python
import os
import serial

ser = serial.Serial('/dev/ttyAMA0', 4800)
while True :
 try:
    state=ser.readline()
    print(state)
 except:
    pass

所以,“状态”现在应该给一个 shell 脚本, 喜欢:myscript.sh "This is the serial input..." 但是我该怎么做呢?

print(os.system('myscript.sh ').ser.readline())

没用。

【问题讨论】:

  • os.system() 不会向print 返回任何你想要的东西。如果子进程将任何内容打印到标准输出,那么它就会去那里,而您的 Python 脚本不会知道。如果您想捕获子进程打印的内容,您还有另一个理由来查看 subprocess 模块,特别是 check_output 方法(Python 2.7+)

标签: python shell variables os.system


【解决方案1】:

只是简单的字符串连接传递给 os.system 函数。

import os
os.system("myscript.sh " + ser.readline())

【讨论】:

    【解决方案2】:

    如果myscript 可以持续读取额外的输入,那么您的管道效率会高得多。

    from subprocess import Popen, PIPE
    sink = Popen(['myscript.sh'], stdin=PIPE, stdout=PIPE)
    while True:
        sink.communicate(ser.readline())
    

    如果您必须为每个输入行创建一个新的myscript.sh,(您确实想重新考虑您的设计,但是)您当然可以:

    while True:
        subprocess.check_call(['myscript.sh', ser.readline())
    

    请注意在这两种情况下我们如何avoid a pesky shell

    【讨论】:

    • 谢谢, - 是的,我会为每个输入行启动一个新脚本,因为一天只有几行,我需要能够更改进程脚本,而不会中断读取 - 行过程,所以从5年前开始,我决定做两个脚本,一个用于阅读,一个用于测试台词。但是用于阅读的 shell 脚本在新硬件(pi 3)上不起作用,所以我现在正在搜索一个新的“阅读”脚本。
    【解决方案3】:

    有多种方法可以组合两个字符串(即"./myscript.sh"ser.readLine()),然后您可以使用os.system 运行完整的命令。例如。字符串可以是string.format 方法的参数:

    os.system('myscript.sh {}'.format(ser.readline()))
    

    你也可以只添加两个字符串:

    os.system('myscript.sh '+ser.readline())
    

    我不确定你想用print 语句实现什么。处理代码调用和输入/输出的更好方法是从 os 切换到 subprocess module

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-08
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多