NativeProcess通信给出错误

时间:2016-02-24 05:08:59

标签: python actionscript-3 flash

我试图通过actionscript与python脚本进行通信。它在线给我错误:
var stdOut:ByteArray = process.standardOutput; 从下面显示的功能:

public function onOutputData(event:ProgressEvent):void 
{ 
    var stdOut:ByteArray = process.standardOutput; //error
    var data:String = stdOut.readUTFBytes(process.standardOutput.bytesAvailable); 
    trace("Got: ", data); 
}

错误是:

  

使用静态类型IDataInput将值隐式强制转换为可能的值   不相关的类型ByteArray。

我遵循与Adobe页面相同的方法。这是一些可测试的代码:

package
{
    import flash.display.Sprite;
    import flash.desktop.NativeProcessStartupInfo;
    import flash.filesystem.File;
    import flash.desktop.NativeProcess;
    import flash.events.ProgressEvent;
    import flash.utils.ByteArray;

    public class InstaUtility extends Sprite
    {
        public var nativeProcessStartupInfo:NativeProcessStartupInfo = new     NativeProcessStartupInfo();
        public var file:File = new File("C:/Python27/python.exe");
        public var process:NativeProcess = new NativeProcess();
        public function InstaUtility()
        {
            nativeProcessStartupInfo.executable = file;
            nativeProcessStartupInfo.workingDirectory =     File.applicationDirectory.resolvePath(".");
            trace("Location " + File.applicationDirectory.resolvePath(".").nativePath);
            var processArgs:Vector.<String> = new Vector.<String>();
            processArgs[0] = "test.py";
            nativeProcessStartupInfo.arguments = processArgs;
            var process:NativeProcess = new NativeProcess();
            process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); 
            process.start(nativeProcessStartupInfo); 
        }   
        public function onOutputData(event:ProgressEvent):void 
        { 
            var stdOut:ByteArray = process.standardOutput; //error
            var data:String = stdOut.readUTFBytes(process.standardOutput.bytesAvailable); 
            trace("Got: ", data); 
        }

    }
}

1 个答案:

答案 0 :(得分:0)

  

无法启动NativeProcess。目前不支持   轮廓。

您是否在Flash IDE中进行测试?

  • 在IDE中进行测试:在AIR发布设置中,确保在通过IDE进行调试时仅选中“扩展桌面”。这样你也会得到痕迹等。

  • 发布后测试:您必须同时勾选“桌面”和“扩展桌面”并勾选“ Windows Installer(.exe)“。使用生成的 .exe 文件(而不是 .air 文件)安装您的应用。

  

使用静态类型IDataInput将值隐式强制转换为可能的值   不相关的类型ByteArray。

var stdOut:ByteArray = process.standardOutput; //error不是这样做的!每次进度事件触发时都不要进行任何 var 。每次触发仅保留 32kb 64kb 字节(无法记住),因此如果预期结果较大,则会继续以多个块的形式触发...使用并回收一个public byteArray来保存所有结果数据。

尝试如下设置:

//# Declare the public variables
public var stdOut : ByteArray = new ByteArray();
public var data_String : String = "";

您的流程还需要 NativeProcessExitEvent.EXIT 侦听器。

process.addEventListener(NativeProcessExitEvent.EXIT, on_Process_Exit );

在您.start进程之前,还要使用stdOut.clear();清除byteArray以准备新数据。

现在您的 progressEvent 如下所示...... (处理将结果数据放入 stdOut 字节)

public function onOutputData (event:ProgressEvent) : void 
{ 
    //var stdOut:ByteArray = process.standardOutput; //error

    //# Progress could fire many times so keep adding data to build the final result
    //# "stdOut.length" will be zero at first but add more data to tail end (ie: length)
    process.standardOutput.readBytes( stdOut, stdOut.length, process.standardOutput.bytesAvailable );

    //# Below should be in a Process "Exit" listener but might work here too
    stdOut.position = 0; //move pointer back before reading bytes
    data_String = stdOut.readUTFBytes( stdOut.length ); 
    trace("function onOutputData -- Got : "  + data_String ); 
}

但是你真的需要添加一个“ onProcessExit ”监听器,然后只在进程本身完成时检查结果。 (此处的跟踪对于保证结果更安全)

public function on_Process_Exit (event : NativeProcessExitEvent) : void 
{
    trace ("PYTHON Process finished : ############# " )
    stdOut.position = 0; //# move pointer back before reading bytes
    data_String = stdOut.readUTFBytes( stdOut.length ); 
    trace("PYTHON Process Got : "  + data_String );

}