关闭

AIR 调用 Python 脚本的解决方案

发表于:2024-9-02 09:33

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:华科小张    来源:稀土掘金

  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 应用程序调用该可执行文件。
  代码例子:
  // 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] = '\0';
    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 脚本。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2024软件测试行业从业人员调查问卷》,您的见解,行业的声音!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号