【问题标题】:How to access Python standard stream in IDL Spawn command?如何在 IDL Spawn 命令中访问 Python 标准流?
【发布时间】:2017-11-06 19:56:15
【问题描述】:

我有一个这样的python程序:

raw_data = sys.stdin.buffer.read(nbytes) # Read from standard input stream
# Do something with raw_data to get output_data HERE...
output_mask = output_data.tostring() # Convert to bytes
sys.stdout.buffer.write(b'results'+output_mask) # Write to standard output stream

然后我使用 Pyinstaller 获取这个 python 程序的 my_py.exe。我在 Python 中使用 subprocess.run() 测试 my_py.exe。没关系。

但是,我需要在 IDL 中调用这个 my_py.exe。 IDL 有this tutorial 关于如何将其SPAWN 命令与管道一起使用。所以我调用 my_py.exe 的 IDL 程序是这样的:

SPAWN['my_py.exe', arg], COUNT=COUNT , UNIT=UNIT

WRITEU, UNIT, nbytes, data_to_stream

READU, UNIT, output_from_exe

不幸的是,上面的 IDL 程序在 READU 处挂起。有人知道我在这里遇到的问题吗?我的python读写有问题吗?

【问题讨论】:

    标签: python pipe stdio spawn idl-programming-language


    【解决方案1】:

    您在SPAWN 命令中缺少逗号,尽管我想如果您的代码中有错字,IDL 会在您到达READU 之前发出语法错误。但是,如果出于某种原因,IDL 正在悄悄地继续执行错误的SPAWN 调用,那么READU 可能会挂起,因为它正在尝试读取一些无意义的逻辑单元。无论如何,它应该是:

    SPAWN,['my_py.exe', arg], UNIT=UNIT

    这是完整的语法供参考:

    SPAWN [, 命令 [, 结果] [, ErrResult] ]

    关键字(所有平台): [, COUNT=variable] [, EXIT_STATUS=variable] [ ,/NOSHELL] [, /NULL_STDIN] [, PID=variable] [, /STDERR] [, UNIT=variable {Command required, Result and ErrResult not allowed}]

    仅限 UNIX 关键字: [, /NOTTYRESET] [, /SH]

    仅限 Windows 的关键字: [, /HIDE] [, /LOG_OUTPUT] [, /NOWAIT]

    我删除了 COUNT 关键字,因为根据documentation,COUNT 包含 Result 中的行数,如果 Result 存在,但它不存在。事实上,这里甚至不允许使用 Result,因为您使用的是 UNIT 关键字。我怀疑传递 COUNT 关键字会导致 READU 挂起,但这是不必要的。

    另外,请查看文档中的此注释 确保您作为命令传递的数组是正确的:

    如果存在 Command,则必须按如下方式指定:

    在 UNIX 上,Command 应该是标量,除非与 NOSHELL 关键字一起使用,在这种情况下,Command 应该是一个字符串数组,其中每个元素作为单独的参数传递给子进程。

    在 Windows 上,Command 可以是标量字符串或字符串数​​组。如果是字符串数组,SPAWN 将字符串数组的每个元素粘合在一起,每个元素用空格分隔。

    我不知道你的代码的细节,但这里有一些进一步的猜测:

    • 您可以尝试设置 NOSHELL 关键字,就像在黑暗中开枪一样。

    • 当我没有关闭文件单元时,我偶尔会遇到 IDL 似乎无法完成写入磁盘的问题,因此请确保在 READU 之后使用 FREE_LUN, UNIT。我知道你说它挂在READU,但我的想法是也许它只是看起来挂起,并且在文件单元关闭之前无法继续。

      李>

    最后,这实际上可能是问题所在,值得研究(来自您链接到的教程):

    管道只是一个由操作系统维护的缓冲区,它具有一个接口,使其对使用它的程序显示为一个文件。它具有固定的长度,因此可以完全填充。发生这种情况时,操作系统会将填充管道的进程置于睡眠状态,直到另一端的进程消耗缓冲的数据。 使用双向管道会导致两个进程都在等待另一个进程的死锁情况。如果父进程和子进程不同步它们的读写活动,就会发生这种情况。

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多