在Linux上将终端程序从Bash迁移到Python

2024-09-20 22:21:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我要处理的是一个工业环境,我必须记录现场串行设备的读数。我当前的设置包括连接到Moxa 5150A或5130串行设备服务器的设备,该服务器通过有线或无线方式连接到我的网络,具体取决于单个设备的位置。目前,我依靠硬件供应商的软件来管理数据收集。目前的软件是基于windowsx86的,由于以前的硬件故障,我们购买的新硬件上的麻烦不断。我选择Moxa串行服务器是为了它们的linux驱动程序和兼容性。该设备通过RS-422(4线半双工)7位1站奇偶校验和无流量控制进行通信,除非请求,否则不发送任何信息。在

我正在开发我自己的解决方案,将信息存储在数据库中(可能是MySQL)。就终端通信而言,这是两部分。我必须发送请求并接收响应。在

到目前为止,我已经在我的linux服务器上安装了串行服务器的Moxa驱动程序。我编写了一个bash脚本,从/dev/ttyrXX设备读取,解释输入并将信息加载到mysql数据库中。在

      while read line
      do
      something something....
      done < /dev/ttyrXX

我仍然在解决一些小的脚本错误,比如当设备脱机时重新启动,然后重新联机,以及其他类似的问题,但是我的脚本在我需要的范围内读取和记录我的数据。在

这个解决方案依赖于两个因素。在

1)Moxa设备支持FIFO并允许同时进行多个连接

2)在单独的windows计算机上运行的供应商提供的软件当前正在提交信息请求。在

我需要删除所有基于windows的软件。我编写并测试了一个脚本,该脚本打印到/dev/ttyrXX,发出我想要的请求,并接收到相应的响应,并按照我的第一个脚本的要求将它们记录下来。在

^{pr2}$

我在使用供应商提供的软件时遇到的一个主要问题是,它的硬编码依赖于接收对每个请求的及时响应。这会产生许多问题,包括完全冻结窗口和设备在不合适的时间停止服务时崩溃。在

我的两个脚本协同工作,以一个明显更好的间隔收集数据,并且更少的人为干预。在

这是我的问题。我可以在Python中使用什么方法来获得与Bash脚本类似的结果?在

我找不到一个与printf或cat等价的Python,它不需要我打开/关闭文件。此外,我看过的每一个终端接口都有内置的或需要等待响应或读取的功能,等待很长时间才放弃。我确信那里确实存在着某种东西,我只是没有找到它的运气。我承认我是Python的新手,没有写过几行代码来探究它的能力。在

让我说清楚。我想写我的终端时,不关心任何其他事情(使用线程或单独的脚本,我不在乎)。我想在我的终端上阅读,而不在乎下一段文字何时到来。(我并不是建议一个永无止境的循环,但我确实需要它来支持和等待输入)。我想让我的书信往来完全独立,不关心对方昨天、现在或下周在做什么。在

提前谢谢你。在

如果有必要,我将能够提供更详细的代码,但是我觉得我更需要的是在我的搜索方向,而不是错误修复。尽管我仍然完全接受建议和“永远不要这样做…”。。。。因为这个…“输入


Tags: 数据dev服务器脚本信息终端硬件软件
3条回答

听起来你想打开一个文件进行读/写,然后依次读取每一行。在

with open(..., 'r+') as dev:
  for line in dev:
     ...
    print >>dev, 'foo'

我推荐pyserial(可以使用非阻塞),但是我不知道它是否能正确处理RS232以外的任何东西。在

I have been unable to locate a Python equivalent to printf or cat that does not require me to open/close a file.

通常,只需打开文件并调用.write()函数(相当于printf)或.readline()函数。这有什么问题吗?当您从shell脚本使用“cat”或“echo”或管道时,这也会在后台打开和关闭文件。如果你真的因为某种原因(例如内核驱动程序出了问题)而需要重新打开文件,那么你只需编写一个python函数就可以了。在

Furthermore every terminal interface I've looked at has the built-in or required wait for response or read for so long before giving up.

串行库通常只有在读取时才有超时,而不是在写(但是对于写,内核驱动程序通常有一个缓冲区,如果你写得太快,理论上可能会溢出……)。在

我不明白的是这个超时对你来说是个问题吗?如果你能用两个独立的python程序打开终端,一个写,一个读,你的问题就解决了,对吧?在

您应该知道,您可以对文件执行阻塞或非阻塞I/O。默认情况下,一切都将被阻塞。您可以使用select()系统调用(同样来自Python)来绕过线程或独立进程的每个需要。选择将在不阻塞的情况下读/写文件、出现异常(如设备消失)或超时(如果设置了超时)时返回。在

扩展伊格纳西奥的话。启动脚本可能是最简单的解决方案。在

其中一个打开tty设备,并永远收听它。这是一个阻塞读取。它继续寻找新的输入行,直到收到(或达到)EOF。在这种情况下,大概不会发生这种情况。它看起来像这样:

# tty reader

def listen_to_device():
    with open('/dev/ttyXX', 'r') as tty:
        for line in tty:
            create_db_record(line)

if __name__ == '__main__':
    listen_to_device()

要使它成为一个完整的工作代码,您需要实现的唯一一件事就是“create_db_record”函数。在

第二个脚本可能非常相似。但也许它会继续在目录中查找包含命令的特定文件。当它在另一个设备之后找到另一个。在

^{pr2}$

您可以在send_命令函数中添加一些额外的处理代码,以便在命令.txt文件变得非常简单。在

相关问题 更多 >

    热门问题