【问题标题】:PYTHON, LINUX: streaming to and from cmdlinePYTHON,LINUX:流式传输到命令行和从命令行传输
【发布时间】:2017-03-13 08:38:28
【问题描述】:

我正在尝试使用 gpsd 库解码一些非标准 AIS(带有额外信息标记的 nmea 字符串)数据。 AIS 数据是从一个不断增加的文本文件中读取的(每天一个,换行符是新数据)。一些处理在 python 中完成,然后推送到 GPSD 解码器进行解码并返回给 python 进行更多工作。目前这是使用 os.system 或 subprocess.check_output (它们都花费相同的时间)和命令完成的:

echo "single_nmea_string" | gpsdecode

这可行,但速度非常慢。如果我将所有 NMEA 字符串写入文本文件并进行批量解码,速度会快 10-50 倍:

cat all_processed_nmea_strings.txt | gpsdecode

但这不能实时工作,因为我需要尽快处理传入的数据。

有没有办法在 Python 中打开 gpsdecode(或任何其他 cmdline 工具)的管道,在 nmea_strings 准备好时将其发送并读取结果,而无需始终启动/停止该工具?我已经在使用带队列的多处理来加快处理速度,但瓶颈是解码位。

有什么想法吗?

编辑: 进一步的测试表明,“缓慢”可能与 cmdline 解码无关。这可能是我在工作人员之间拆分数据的地方。需要做一些分析。

【问题讨论】:

    标签: python linux os.system nmea gpsd


    【解决方案1】:

    我认为subprocess.Popen 在您的情况下使用有点不方便:您不能使用communicate(),因为它会等待子进程完成,因此您必须处理文件描述符并注意不填充管道缓冲区。请参阅this question 了解一些想法。

    恕我直言,更好的选择是使用pexpect package

    【讨论】:

    • 得到了这个工作,但它没有显示出任何改进。我认为问题可能出在脚本的其他地方?这可能与我在流程工作人员之间拆分数据的方式有关。不过感谢您的帮助,当我认为我知道问题所在时,这正是我正在寻找的工具。
    猜你喜欢
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多