Flutter集成Python功能插件serious_python的使用
Flutter集成Python功能插件serious_python的使用
描述
serious_python
是一个跨平台插件,用于在Flutter应用程序中嵌入Python运行时。通过这个插件,可以在移动或桌面Flutter应用的后台运行Python程序,而不阻塞用户界面。文件处理、SQLite数据库操作、调用REST API、图像处理、机器学习、人工智能等繁重的任务可以方便地在Python中实现,并直接在移动设备上运行。
构建应用程序后端服务并将其托管在Flutter应用内。Flutter应用不直接调用Python函数或模块,而是通过Python程序提供的API(如:REST API、套接字、SQLite数据库或文件)与Python环境通信。
serious_python
是Flet项目的一部分——这是用Python构建多平台应用的最快方式。创建Serious Python
的动机是拥有一个可重用、易于使用的插件,该插件经过维护和支持,可以在iOS或Android设备上运行真实世界的Python应用程序,而不仅仅是“1+2”或“hello world”示例,因此得名“Serious Python”。
平台支持
平台 | 支持情况 |
---|---|
iOS | ✅ |
Android | ✅ |
macOS | ✅ |
Linux | ✅ |
Windows | ✅ |
Python 版本
- 所有平台均支持Python 3.12.6。
使用方法
基础步骤
- 将你的Python应用程序打包成
app.zip
,复制到Flutter应用程序根目录下的app
(或其他任何)目录中,并将其作为资源添加到pubspec.yaml
:
flutter:
assets:
- app/app.zip
- 在Dart代码中导入
serious_python
包:
import 'package:serious_python/serious_python.dart';
- 创建
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}
可以是以下之一:Android
、iOS
、macOS
、Windows
、Linux
或Pyodide
。
默认情况下,该命令创建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.txt
从requirements.txt
文件安装依赖项。
对于iOS
和Android
平台,开发者应设置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 widget和Flet框架以轻松创建出色的Flutter应用程序的示例。
Run app for integration tests
这是一个简单的应用程序,它使用Python将随机值保存到文本文件中,然后从Dart中读取它——用于集成测试。
希望这篇文档对你理解如何在Flutter中集成Python有所帮助!如果你有任何问题或需要进一步的帮助,请随时提问。
更多关于Flutter集成Python功能插件serious_python的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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
插件。如果有任何具体的问题或需要进一步的帮助,请查阅插件的官方文档或相关资源。