如何在IDL Spawn命令中访问Python标准流?

问题描述 投票:1回答:1

我有一个像这样的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个回答
0
投票

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

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

以下是完整的参考语法:

SPAWN [,Command [,Result] [,ErrResult]]

关键字(所有平台):[,COUNT =变量] [,EXIT_STATUS =变量] [,/ NOSHELL] [,/ NULL_STDIN] [,PID =变量] [,/ STDERR] [,UNIT =变量{需要命令,结果和错误的ErrResult}]

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

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

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

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

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

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

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

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

  • 您可以尝试设置NOSHELL关键字,就像在黑暗中拍摄一样。
  • 当我没有关闭文件单元时,我偶尔会遇到IDL不能完成写入磁盘的问题,因此请确保在FREE_LUN, UNIT之后使用READU。我知道你说它挂在READU,但我的想法是,它可能只是挂起,并且只能在文件单元关闭之前继续。

最后,这里的内容实际上可能是问题,值得研究(从您链接到的教程):

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

© www.soinside.com 2019 - 2024. All rights reserved.