2010-09-03 64 views
1

我試圖從Javascript中使用NativeProcess API啓動python腳本。 在Adobe AIR API Reference for HTML Developers上,我發現了一個很好的例子,但它不起作用。我查了許多其他的例子,但仍然找不到答案。使用Javascript的Adobe Air2 NativeProcess API

下面是HTML文件中的示例代碼:

<html> 
    <head> 
    <title>Test</title> 
    <script type="text/javascript" src="AIRAliases.js"></script> 
    <script type="text/javascript"> 

     var process; 

     function launchProcess() 
     { 
      if(air.NativeProcess.isSupported) 
      { 
       air.trace("NativeProcess supported."); 
    setupAndLaunch(); 
      } 
      else 
      { 
       air.trace("NativeProcess not supported."); 
      } 
     } 

     function setupAndLaunch() 
     {  
      var nativeProcessStartupInfo = new air.NativeProcessStartupInfo(); 
      var file = air.File.applicationDirectory.resolvePath("test.py"); 
      nativeProcessStartupInfo.executable = file; 

      var processArgs = new air.Vector["<String>"](); 
      processArgs.push("foo"); 
      nativeProcessStartupInfo.arguments = processArgs; 

      process = new air.NativeProcess(); 
      process.start(nativeProcessStartupInfo); 
      process.addEventListener(air.ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); 
      process.addEventListener(air.ProgressEvent.STANDARD_ERROR_DATA, onErrorData); 
      process.addEventListener(air.NativeProcessExitEvent.EXIT, onExit); 
      process.addEventListener(air.IOErrorEvent.STANDARD_OUTPUT_IO_ERROR, onIOError); 
      process.addEventListener(air.IOErrorEvent.STANDARD_ERROR_IO_ERROR, onIOError); 
     } 

     function onOutputData() 
     { 
      air.trace("Got: ", process.standardOutput.readUTFBytes(process.standardOutput.bytesAvailable)); 
     } 

     function onErrorData(event) 
     { 
      air.trace("ERROR -", process.standardError.readUTFBytes(process.standardError.bytesAvailable)); 
     } 

     function onExit(event) 
     { 
      air.trace("Process exited with ", event.exitCode); 
     } 

     function onIOError(event) 
     { 
      air.trace(event.toString()); 
     } 

    </script> 
    </head> 

    <body onload="launchProcess()"> 
    </body> 
</html> 

這裏的蟒蛇文件中的代碼(它不工作):

#! /usr/bin/env python2.5 
# -*- coding: utf-8 -*- 

import sys 

for word in sys.argv: #echo the command line arguments 
print word 

print "HI FROM PYTHON" 
print "Enter user name" 
line = sys.stdin.readline() 

sys.stdout.write("hello," + line) 

與命令運行AIR應用程序adl main.xml僅在我的終端(我使用OSX)中顯示「支持NativeProcess」。

感謝您的幫助。

在這裏,我也給蟒蛇文件的變更得到它的工作:

#! /usr/bin/env python2.5 
# -*- coding: utf-8 -*- 

import sys 
import os 

def convert(args): 
path = os.path.expanduser('~') + "/Desktop/" 

myFile = open(path+args, 'w') 
myFile.write('Hello World\n') 
myFile.close() 

sys.stdout.write("Python Done") 

if __name__ == "__main__": 
convert(sys.argv[1]) 

由於pyfunc ...

回答

0

如果你運行程序,然後下面是輸出:

test.py 
HI FROM PYTHON 
Enter user name 

那就是這段python代碼正在尋找標準輸入和寫入標準輸出。 我不認爲這是可能的,如果你不從殼運行。

如何去除:

line = sys.stdin.readline() 
sys.stdout.write("hello," + line) 

,並做一些無關痛癢的Python表達式就像

a = 1+4 

,看看,是否可行。我有一個預感,這可能是一個問題。

+0

感謝您的幫助。更改Python代碼工作正常。有關我最終做的細節,請看上面編輯的問題。 – eltorrero 2010-09-04 10:19:23