我有一个依赖于MinimalModbus
和pySerial
库的自定义python脚本。我试图将它部署到运行python解释器的路由器。
MinimalModbus
只是一个单独的.py文件,部署起来很简单。但是,pySerial
库看起来更强大。它看起来像几个python文件一起工作,自动选择适当的后端"。
是否必须安装" pySerial
为了使用它?或者是否有某种方法可以仅提取给定操作系统的相关文件/依赖项?
运行pySerial的setup.py(例如复制的文件?)时,我不知道所有内容都已执行。我不知道它是否适用于这种特定类型的部署。我希望只包含特定文件。
任何帮助将不胜感激。
我们使用的是Python 2.6版。
更新
我基本上已经安装了""来自我的开发盒上/ site-packages / serial文件夹的文件,并将它们上传到设备。这让我更进一步;但是,我现在收到以下错误:
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模块发表以下评论:
目前,Digi设备中os模块的使用非常有限。暴露它的主要目的是允许访问串行端口,这些端口在文件系统中显示为节点。串口可用作文件,其路径格式为/ com / 0,其零替换为要控制的串口的从零开始的索引。
此外,他们的两个示例应用程序都使用os.open例程进行串行通信。
我原本希望看到一个错误,如:OSError:[Errno 2]没有这样的文件或目录:' / com / 0',但事实并非如此。 Python甚至无法找到os.open例程。
您是否希望os.py文件定义def open(...)
例程?
答案 0 :(得分:1)
在与此路由器的制造商打开支持案例后,发现该设备不支持os.open
功能。但是,该设备确实支持io.open
我相信它是相似的。更重要的是,我了解到制造商提供了他们自己的" pyserial"专门设计用于设备操作系统的实现。在内部,看起来他们已经切换出使用io.open
等效的调用。
答案 1 :(得分:-1)
说过看起来你需要几个源文件才能使它工作,如果你只是简单地复制它们,你可能需要修改它们的导入以确保它们正常工作。
例如对于linux,您需要serialposix.py文件和serialutil.py
你可能需要的不仅仅是这个,但我只是快速浏览一下。
但是在serialposix.py的顶部有一行:
from serial.serialutil import *
这需要更改为:
from serialutil import *
可能还有其他此类更改。
但最终这似乎使用ctypes来与底层操作系统进行艰苦的工作,所以你应该能够使它工作。
更新: 解释为什么它调用os.open,在大多数平台上串口都被视为几乎像文件一样,返回一个“文件就好”的句柄,pyserial背后的想法就是抽象操作系统级别差异来创建单个易于这些接口,但最终它仍被视为操作系统的句柄文件。
只是为了澄清你能让我们知道你正在使用什么版本的pyserial吗?你引用的行号和我看的不匹配。
我怀疑你遇到困难的主要原因是你正在使用的python部署的zip性质,但是我觉得很难相信OS不包含在其中,你有没有检查过ZIP中的OS python文件或者它是一个已编译的python文件?
更新2:
看着你正在使用的发行版的文档,我建议你阅读以下内容:
Python Standard Modules with Digi-Specific Behavior
这些设备的某些功能受到限制,它还提供了一种方法,您可以通过该方法测试telnet / SSH是否支持设备并在python命令行上尝试它。
另外,虽然它像pyserial模块一样整洁且易于使用,但我建议您也阅读: Digi Serial Port Access