pySerial 部署的问题

Trouble with pySerial deployment

我有一个依赖于 MinimalModbuspySerial 库的自定义 python 脚本。我正在尝试将它部署到 运行 是 python 解释器的路由器。

MinimalModbus 只是一个部署起来很简单的 .py 文件。然而,pySerial 库似乎更强大。它看起来像几个 python 文件一起工作 "automatically select the appropriate backend".

是否必须 "install" pySerial 才能使用它?或者有什么方法可以为给定的 OS 提取相关的 files/dependencies?

我不知道当你 运行 pySerial 的 setup.py 时都执行了什么(例如复制文件?)。我不知道它是否适用于这种特定类型的部署。我希望只包含特定文件。

我们将不胜感激。

我们正在使用 Python 2.6 版。

更新:

我基本上是从我的开发盒上的 /site-packages/serial 文件夹中取出 "installed" 文件并将它们上传到设备上。这让我更进一步;但是,我现在收到以下错误:

serialposix.py 的 ~273 行,它正在调用:

self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK)

为什么找不到os.open例程?

更新 2

进一步简化问题,我的脚本现在包含如下简单的内容,但它仍然失败并出现相同的错误:

import os
serfd = os.open("/com/0", os.O_RDWR | os.O_NONBLOCK)

Python Standard Modules with Digi-Specific behavior 下,他们对 os 模块做出以下评论:

os 模块在 Digi 设备中的使用目前非常有限。 exposing 中的主要目的ose 是允许访问串行端口,这些端口在文件系统中显示为节点。串行端口可作为文件使用,路径格式为 /com/0,其中零替换为要控制的串行端口的从零开始的索引。

此外,他们的两个示例应用程序都使用 os.open 例程进行串行通信。

我本以为可能会看到这样的错误:OS错误:[Errno 2] 没有这样的文件或目录:'/com/0',但事实并非如此。 Python 甚至找不到 os.open 例程。

您希望 os.py 文件定义 def open(...) 例程吗?

查看源文件后,我相信它完全是基于 python 的,并且在安装时将文件复制到 site-packages 文件夹。

话虽如此,您似乎需要几个源文件才能使其正常工作,如果您只是简单地复制它们,您可能需要修改它们的导入以确保它们正常工作。

例如 linux 你需要 serialposix.py 文件和 serialutil.py

您可能需要的不仅仅是这些,但我只是快速浏览了一下。

但在 serialposix.py 的顶部有一行:

from serial.serialutil import *

这需要更改为:

from serialutil import *

并且可能还有其他此类更改需要进行。

但最终这似乎是使用 ctypes 来完成与底层通信的艰苦工作 OS,所以你应该能够让它工作。

更新: 为了解释它调用 os.open 的原因,在大多数平台上,串行端口几乎被视为文件,也就是说 return 一个 "file like" 句柄,pyserial 背后的想法是抽象操作系统级别的差异远离创建一个易于与这些接口的接口,但最终它仍被 OS.

视为类似句柄的文件

只是为了澄清一下,你能告诉我们你使用的是什么版本的 pyserial 吗?因为你引用的行号和我看到的不匹配。

我怀疑您遇到困难的主要原因是您正在使用的 python 部署的压缩性质,但我确实很难相信 OS 不包含在其中,您检查过 ZIP 中的 OS python 文件还是已编译的 python 文件?

更新 2: 查看了您正在使用的发行版的文档后,我建议您阅读以下内容:
Python Standard Modules with Digi-Specific Behavior

其中指出某些功能在这些设备上受到限制,它还提供了一种方法,您可以通过该方法测试设备 telnet/SSH 是否支持它并在 python 上试用命令行。

此外,虽然它不像 pyserial 模块那样简洁易用,但我建议您也读一读:
Digi Serial Port Access

向该路由器的制造商提出支持案例后,发现该设备不支持 os.open 功能。但是,该设备确实支持 io.open,我认为这是相似的。更重要的是,我了解到制造商提供了他们自己的 "pyserial" 实现,专门设计用于设备的操作系统。在内部,看起来他们已经关闭了调用以使用 io.open 等价物。