Flutter集成Python功能插件serious_python的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter集成Python功能插件serious_python的使用

描述

serious_python 是一个跨平台插件,用于在Flutter应用程序中嵌入Python运行时。通过这个插件,可以在移动或桌面Flutter应用的后台运行Python程序,而不阻塞用户界面。文件处理、SQLite数据库操作、调用REST API、图像处理、机器学习、人工智能等繁重的任务可以方便地在Python中实现,并直接在移动设备上运行。

构建应用程序后端服务并将其托管在Flutter应用内。Flutter应用不直接调用Python函数或模块,而是通过Python程序提供的API(如:REST API、套接字、SQLite数据库或文件)与Python环境通信。

serious_pythonFlet项目的一部分——这是用Python构建多平台应用的最快方式。创建Serious Python的动机是拥有一个可重用、易于使用的插件,该插件经过维护和支持,可以在iOS或Android设备上运行真实世界的Python应用程序,而不仅仅是“1+2”或“hello world”示例,因此得名“Serious Python”。

平台支持

平台 支持情况
iOS
Android
macOS
Linux
Windows

Python 版本

  • 所有平台均支持Python 3.12.6。

使用方法

基础步骤

  1. 将你的Python应用程序打包成app.zip,复制到Flutter应用程序根目录下的app(或其他任何)目录中,并将其作为资源添加到pubspec.yaml
flutter:
  assets:
    - app/app.zip
  1. 在Dart代码中导入serious_python包:
import 'package:serious_python/serious_python.dart';
  1. 创建SeriousPython类的实例并调用其run()方法:
SeriousPython.run("app/app.zip");

默认情况下,当应用程序启动时,存档将被解压到临时目录中,Serious Python插件将尝试运行存档根目录中的main.py。当前目录会更改为临时目录。

如果Python应用程序有不同的入口点,则可以通过appFileName参数指定:

SeriousPython.run("app/app.zip", appFileName: "my_app.py");

你可以传递一个包含环境变量的映射,这些环境变量应在Python程序中可用:

SeriousPython.run("app/app.zip",
    appFileName: "my_app.py",
    environmentVariables: {"a": "1", "b": "2"});

默认情况下,Serious Python期望Python依赖项安装在应用程序目录根目录中的__pypackages__目录中。你可以使用modulePaths参数添加其他路径以查找第三方包:

SeriousPython.run("app/app.zip",
    appFileName: "my_app.py",
    modulePaths: ["/absolute/path/to/my/site-packages"]);

包装Python应用程序

为了简化Python应用程序的打包,Serious Python提供了一个CLI,可以通过以下命令运行:

dart run serious_python:main

有一个package命令,它接受Python应用程序目录作为第一个参数。该命令必须在包含pubspec.yaml的Flutter应用程序根目录中运行。路径可以是相对路径或绝对路径。

为特定平台打包Python文件:

dart run serious_python:main package app/src -p {platform}

其中{platform}可以是以下之一:AndroidiOSmacOSWindowsLinuxPyodide

默认情况下,该命令创建app/app.zip资产,但你可以使用--asset参数更改其路径/名称:

dart run serious_python:main package --asset assets/myapp.zip app/src -p {platform}

Python应用程序依赖项可以使用--requirements选项安装。--requirements选项的值直接传递给pip命令。例如,--requirements flet,numpy==2.1.1将直接安装两个依赖项,或--requirements -r,requirements.txtrequirements.txt文件安装依赖项。

对于iOSAndroid平台,开发者应设置SERIOUS_PYTHON_SITE_PACKAGES环境变量,指向安装的应用程序包的临时目录。该目录的内容将在应用程序编译期间嵌入应用程序包中。

例如:

export SERIOUS_PYTHON_SITE_PACKAGES=$(pwd)/build/site-packages
dart run serious_python:main package app/src -p iOS --requirements -r,app/src/requirements.txt

对于macOS、Linux和Windows应用程序包,应用程序包资产zip中的__pypackages__内部安装了应用程序包。

确保生成的资产已添加到pubspec.yaml中。

Python 应用程序结构

默认情况下,嵌入式Python程序是在单独的线程中运行的,以避免阻塞UI。Flutter应用程序不应直接调用Python函数或模块,而应该通过Python应用程序提供的API进行通信,如:REST API、套接字、SQLite数据库、文件等。

要持续在后台运行Python程序,它必须是阻塞的,例如监听8000端口的Flask应用程序,或者你可以在threading.Thread中启动长时间运行的计算,并使用threading.Event防止程序退出。

同步执行Python程序也受支持,只需向SeriousPython.run()方法添加sync: true参数。例如,这可能是一个执行某些准备工作的实用程序程序。请确保它要么非常短,要么在Dart isolate中运行以避免阻塞UI。

示例

Python REPL with Flask backend

这是一个使用Flask托管用Python编写的app后端API的例子。

源码

Flet app

这是一个整合了Flet widgetFlet框架以轻松创建出色的Flutter应用程序的示例。

源码

Run app for integration tests

这是一个简单的应用程序,它使用Python将随机值保存到文本文件中,然后从Dart中读取它——用于集成测试。

源码

希望这篇文档对你理解如何在Flutter中集成Python有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。


更多关于Flutter集成Python功能插件serious_python的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter集成Python功能插件serious_python的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中集成Python功能插件serious_python可以让你在移动应用中运行Python代码。以下是一个简单的示例,展示了如何在Flutter项目中集成和使用serious_python插件。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加serious_python插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  serious_python: ^最新版本号  # 请替换为当前最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Android和iOS

serious_python插件依赖于Chaquopy,它允许在Android和iOS上运行Python代码。因此,你需要进行一些额外的配置。

Android配置

android/app/build.gradle文件中,添加以下内容:

android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
        }
    }
    ...
}

dependencies {
    implementation 'com.chaquo.python:gradle:最新版本号'  // 请替换为当前最新版本号
}

然后在android/build.gradle文件的buildscript部分,添加Chaquopy的仓库和依赖:

buildscript {
    repositories {
        google()
        jcenter()
        maven { url 'https://chaquo.com/maven' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:版本号'
        classpath 'com.chaquo.python:gradle:最新版本号'  // 请替换为当前最新版本号
    }
}

iOS配置

对于iOS,你需要在ios/Podfile中添加对Chaquopy的Pod依赖。不过,由于serious_python插件已经封装好了大部分配置,通常不需要手动修改Podfile。但确保你的项目能够构建和运行iOS应用。

3. 使用serious_python插件

以下是一个简单的Flutter应用示例,展示了如何使用serious_python插件来运行Python代码:

import 'package:flutter/material.dart';
import 'package:serious_python/serious_python.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String pythonOutput = "";

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter + Python Example'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text('Python Output:'),
              Text(pythonOutput, style: TextStyle(fontSize: 18)),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: _runPythonCode,
                child: Text('Run Python Code'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> _runPythonCode() async {
    final SeriousPython seriousPython = SeriousPython();

    // 运行简单的Python代码
    String pythonScript = '''
def hello():
    return "Hello from Python!"

result = hello()
print(result)
''';

    try {
      String result = await seriousPython.runScript(pythonScript);
      setState(() {
        pythonOutput = result.trim();  // 移除可能的换行符
      });
    } catch (e) {
      setState(() {
        pythonOutput = "Error: ${e.message}";
      });
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮和一个文本显示区域。点击按钮时,将运行一段Python代码,并将输出结果显示在文本区域中。

请注意,由于serious_python插件依赖于Chaquopy,因此在构建和运行应用时,确保你的开发环境已经正确配置了所有必要的依赖和工具。

这个示例代码应该能够帮助你快速上手在Flutter中集成和使用serious_python插件。如果有任何具体的问题或需要进一步的帮助,请查阅插件的官方文档或相关资源。

回到顶部