我试图通过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);
}
}
}
答案 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 );
}