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

如何在IDL Spawn命令中访问Python标准流?,python,pipe,stdio,spawn,idl-programming-language,Python,Pipe,Stdio,Spawn,Idl Programming Language,我有一个类似这样的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_ma

我有一个类似这样的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
SPAWN['my_py.exe', arg], COUNT=COUNT , UNIT=UNIT

WRITEU, UNIT, nbytes, data_to_stream

READU, UNIT, output_from_exe
然后,我使用Pyinstaller获取这个python程序的my_py.exe。我使用Python中的subprocess.run()测试my_py.exe。很好

但是,我需要在IDL中将其称为my_py.exe。IDL对如何将其SPAWN命令用于管道进行了详细介绍。因此,我的IDL程序调用my_py.exe如下:

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
SPAWN['my_py.exe', arg], COUNT=COUNT , UNIT=UNIT

WRITEU, UNIT, nbytes, data_to_stream

READU, UNIT, output_from_exe

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

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

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

以下是供参考的完整语法:

繁殖[,命令[,结果][,错误结果]]

关键字(所有平台):[,COUNT=variable][,EXIT_STATUS=variable][,/NOSHELL][,/NULL_STDIN][,PID=variable][,/STDERR][,UNIT=variable{命令必需,结果和错误结果不允许}]

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

仅限Windows的关键字:[,/HIDE][,/LOG\u OUTPUT][,/NOWAIT]

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

此外,请从文档中查看此注释 要确保作为命令传递的数组正确,请执行以下操作:

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

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

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

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

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

  • 当我没有关闭文件单元时,我偶尔会遇到IDL无法完成磁盘写入的问题,因此请确保在
    READU
    之后使用
    FREE\u LUN,unit
    。我知道你说它挂起在
    READU
    ,但我在这里的想法是,它可能只是看起来挂起,在文件单元关闭之前无法继续

最后,这里有一些事实上可能是问题所在,值得研究(从您链接到的教程中):

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


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

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

以下是供参考的完整语法:

繁殖[,命令[,结果][,错误结果]]

关键字(所有平台):[,COUNT=variable][,EXIT_STATUS=variable][,/NOSHELL][,/NULL_STDIN][,PID=variable][,/STDERR][,UNIT=variable{命令必需,结果和错误结果不允许}]

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

仅限Windows的关键字:[,/HIDE][,/LOG\u OUTPUT][,/NOWAIT]

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

此外,请从文档中查看此注释 要确保作为命令传递的数组正确,请执行以下操作:

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

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

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

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

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

  • 我偶尔会遇到IDL似乎无法完成写作的问题