AIR 调用 Python 脚本的解决方案

2024-08-02 17:02:08 浏览数 (2)

1. 问题背景

在 AIR 1.5 中,无法直接调用系统命令或运行可执行文件(如 Python 解释器)。

2. 解决方案

由于安全限制,AIR 应用程序无法直接调用系统命令或运行可执行文件。因此,以下解决方案仅适用于能够共享详细信息的情况:

  1. 编写一个本机扩展程序(ANE)以调用 Python:ANE 是本机库,可用于从 AIR 应用程序调用系统命令或运行可执行文件。您可以使用 C/C 、Java 或 Objective-C 编写 ANE。
  2. 使用 CommandProxy 演示:CommandProxy 演示是一个示例项目,演示如何从 AIR 应用程序调用系统命令。它使用 C 编写的 ANE,但您可以根据需要修改它。

以下是一些可能的替代方案:

  • 使用 JavaScript 或 ActionScript 编写脚本,而不是 Python。
  • 将 Python 脚本转换为 AIR 应用程序。
  • 使用其他语言(如 C/C 或 Java)编写可执行文件,然后从 AIR 应用程序调用该可执行文件。

代码例子:

代码语言:javascript复制
// CommandProxyANE.cpp
#include <stdio.h>
#include "CommandProxyANE.h"

FREObject CommandProxyANE_callCommand(FREContext ctx, void* funcData, uint32_t argc, FREObject argv[]) {
  if (argc < 1) {
    return FRE_INVALID_ARGUMENT;
  }

  FREObject resultObject;
  FRENewObjectFromUTF8(0, (const uint8_t*)"result", &resultObject);

  FREByteArray byteArray;
  FREGetObjectAsByteArray(argv[0], &byteArray);

  int length = byteArray.length;
  char* command = new char[length   1];
  FREAcquireByteArray(byteArray, (uint8_t*)command, &length);
  command[length] = '';

  FILE* pipe = popen(command, "r");
  if (pipe == NULL) {
    return FRE_INVALID_ARGUMENT;
  }

  char buffer[1024];
  while (fgets(buffer, sizeof(buffer), pipe)) {
    FREObject outputObject;
    FRENewObjectFromUTF8(0, (const uint8_t*)buffer, &outputObject);

    FREArrayAppend(resultObject, outputObject);
  }

  pclose(pipe);

  return resultObject;
}

void CommandProxyANE_ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) {
  *numFunctionsToTest = 1;

  functionsToSet[0].name = (const uint8_t*)"callCommand";
  functionsToSet[0].functionData = NULL;
  functionsToSet[0].function = CommandProxyANE_callCommand;
}

void CommandProxyANE_ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet) {
  *extDataToSet = NULL;
  *ctxInitializerToSet = CommandProxyANE_ContextInitializer;
  *ctxFinalizerToSet = NULL;
}
```python

```python
// CommandProxyANE.xml
<?xml version="1.0" encoding="UTF-8"?>
<extension xmlns="http://ns.adobe.com/air/extension/1.0">
  <id>com.example.commandproxy</id>
  <version>1.0</version>
  <name>Command Proxy</name>
  <description>A sample extension that allows you to call system commands from an AIR application.</description>
  <author>Example Company</author>
  <authorURL>http://example.com</authorURL>
  <engine>AIR</engine>
  <engineVersion>1.5</engineVersion>
  <engines>
    <engine>AIR</engine>
    <version>1.5</version>
  </engines>
  <platforms>
    <platform>Windows</platform>
    <platform>Macintosh</platform>
    <platform>Linux</platform>
  </platforms>
  <locales>
    <locale>en_US</locale>
  </locales>
  <content>
    <applicationEntryPoint>CommandProxyANE.ane</applicationEntryPoint>
    <initializer>CommandProxyANE.ExtInitializer</initializer>
  </content>
</extension>

以上解决方案仅适用于能够共享详细信息的情况。如果您无法共享详细信息,则无法直接从 AIR 应用程序调用 Python 脚本。

0 人点赞