【问题标题】:Trouble with pySerial deploymentpySerial 部署问题
【发布时间】:2015-01-24 16:15:10
【问题描述】:

我有一个依赖于MinimalModbuspySerial 库的自定义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] No such file or directory: '/com/0',但事实并非如此。 Python 甚至找不到 os.open 例程。

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

【问题讨论】:

  • 你不能用一些东西来为你安装,比如pip吗?
  • 我还在学习这个设备(路由器)和 python,但我认为路由器没有“传统”的 python 安装。所有主要的 Python 库和文件都包含在名为 python.zip 的存档中。我相信在运行时,另一个名为 zipimport 的 python 组件会“提取”这些文件,运行程序并清理它们。你听说过这样的事吗?我已经在他们自己的 zip 文件中添加了 pySerial 文件,它们的行为类似。但还是有些不太对劲……
  • serialposix 不应在 Windows IIRC 上使用,请参阅 github.com/makerbot/pyserial/tree/master/serial pyserial 的 __init__ 从 posix 或 windows 或 java 实现导入实际函数。常用函数在serialutil中。你有原生的 win32 python 或一些 DIY 版本吗?也许是 mingw?

标签: python pyserial


【解决方案1】:

与该路由器的制造商打开支持案例后,发现该设备不支持os.open功能。但是,该设备确实支持io.open,我认为这是相似的。更重要的是,我了解到制造商提供了他们自己的“pyserial”实现,专门设计用于设备的操作系统。在内部,他们似乎已将调用切换为使用 io.open 等效项。

【讨论】:

    【解决方案2】:

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

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

    例如对于 linux,您需要 serialposix.py 文件和 serialutil.py

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

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

    from serial.serialutil import *
    

    这需要改为:

    from serialutil import *
    

    可能还有其他类似的更改。

    但最终这似乎使用 ctypes 来完成与底层操作系统对话的艰苦工作,因此您应该能够使其工作。

    更新: 为了解释为什么它调用 os.open,在大多数平台上,串行端口几乎被视为文件,因为它返回一个“类似文件”的句柄,pyserial 背后的想法是抽象操作系统级别的差异以创建一个易于与这些接口,但最终它仍被操作系统视为像句柄一样的文件。

    为了澄清,您能否告诉我们您使用的是什么版本的 pyserial?因为您引用的行号与我正在查看的内容不匹配。

    我怀疑您遇到困难的主要原因是您使用的 python 部署的 zip 特性,但我确实很难相信操作系统不包含在其中,您是否检查过 ZIP 中的操作系统 python 文件还是编译后的python文件?

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

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

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

    【讨论】:

    • 感谢您的回复。请参阅原始问题中的更新部分。希望您能提供一些额外的指导。
    • 事实证明,我使用的是 pySerial 2.5 版。老实说,我以为我已经下载了 2.7。我将切换到最新的代码,但我认为这不是问题所在。 ZIP 存档中的 os python 文件实际上是编译后的 python 代码 - 它具有 .pyc 扩展名。编译后的代码可以与未编译的代码一起运行吗?我对 python 开发非常陌生 :)
    • 在普通的 python 发行版上,当您导入普通的 python 文件时,它会先编译它,然后您会得到一个并排的编译文件和纯文本文件,因为您的文件是 zip 发行版我不知道这如何/是否会起作用,出于好奇,你从哪里得到你的 python dist 以便我可以阅读它?
    • 设备预装了制造商提供的 python 分发 ZIP 存档。 ZIP 中的所有文件都是用 python 编译的。没有正常的python文件。该文档有些过时 - 它实际上使用的是 Python 2.6。 digi.com/wiki/developer/index.php/…
    • 仅供参考,该设备是 Digi Transport WR 41
    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2020-06-23
    • 2014-07-07
    相关资源
    最近更新 更多