如何在IDL Spawn命令中访问Python标准流?
我有一个类似这样的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
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似乎无法完成写作的问题