Skip to content

Latest commit

 

History

History
183 lines (126 loc) · 6.52 KB

README.md

File metadata and controls

183 lines (126 loc) · 6.52 KB

Chaquopy Flutter plugin

This is an unofficial Chaquopy Flutter plugin to run Python code on Android. This is the simplest version, where you can write your code and run it.

Configuration Steps :

Add maven { url "https://chaquo.com/maven" } and add chaquopy dependency in dependencies section at project level gradle.build like following : You can find the latest-version of chaquopy here, also make sure to update the gradle, python and minimum SDK versions accordingly. You can find the compatible python, android gradle version and minimum SDK version based on chaquopy version here:

buildscript {
    repositories {
        google()
        jcenter()
        maven { url "https://chaquo.com/maven" }
    }
    dependencies {
        ...
        classpath "com.chaquo.python:gradle:latest-version"
    }
}

Then, in the module-level build.gradle file (usually in the app directory), apply the Chaquopy plugin at the top of the file, but after the Android plugin:

apply plugin: 'com.android.application' 
apply plugin: 'com.chaquo.python' 

Apply ABI selection using following code.

defaultConfig {
    ndk {
       abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
    }
}

add this line to application tag in manifest file

android:name="com.chaquo.python.android.PyApplication".

After that sync your project.

Now, in your android folder, you'll have additional python folder created. Now, Download script.py and put it in python directory. (Kindly note that this python file should not be renamed other than script.py and also if your code doesn't work, check the intendations of the downloaded file.)

Now in order to use the chaquopy plugin import the chaquopy package in your flutter app through declaring the package inside pubspec.yaml file.

Now you can run the code easily by calling Chaquopy.executeCode(code) function which returns a map.

The map returned contains two properties and it contains follwing structure:

{
    "textOutputOrError" : "code output or error",
}

you can easily access this code via result["textOutputOrError"] , where result is variable of type map and you can name it anything you want.

FAQs:

  1. Why it shows the notification and also crashes the app after some time limit?

    This plugin uses Chaquopy SDK, which uses a license for the unlimited use case. In order to remove the notification and timelimit, you need to contact here for the license and after you get your license, you need to follow add follwing two lines in your local.properties file.

    1. chaquopy.license=your_license_key
    2. chaquopy.applicationId=package name of the app
  2. Can I use python packages?

    You can use all the python packages by using following configuration.

    defaultConfig {
        python {
            pip {
                install "scipy"
                install "numpy"
                //  specify any other package to install.
            }
        }
    }
    
  3. Why this package doesn't support OpenCV, Matplotlib and NLTK packages?

    I am writing reasons for individual packages here.

    1. OpenCV and Matplotlib : OpenCV and Matplotlib Requires a special configuration, I am working on this issue to be able to integrate in the package itself.

    2. NLTK and Spacy : NLTK and Spacy Packages can be installed and technically run on your device, but most of the NLTK and Spacy functionality relies on it's data that you will be downloading using nltk.download('all'). so It increases the size of the app significantly. I am also working on this feature.

  4. App Size Reduction:

    Using ABI Selection settings you can reduce the app size. The Python interpreter is a native component, so you must use the abiFilters setting to specify which ABIs you want the app to support. The currently available ABIs are:

    armeabi-v7a, supported by virtually all Android devices.

    arm64-v8a, supported by most recent Android devices.

    x86, for the Android emulator.

    x86_64, for the Android emulator.

During development you’ll probably want to enable them all, i.e.:

defaultConfig {
    ndk {
       abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"
    }
}
  1. buildPython:

Some features require Python 3.5 or later to be available on the build machine. These features are indicated by a note in their documentation sections.

By default, Chaquopy will try to find Python on the PATH with the standard command for your operating system, first with a matching minor version, and then with a matching major version. For example, if Chaquopy’s own Python version is 3.8.x, then:

    On Linux and Mac it will try python3.8, then python3.

    On Windows, it will try py -3.8, then py -3.

If this doesn’t work for you, set your Python command using the buildPython setting. For example, on Windows you might use one of the following:

defaultConfig {
    python {
        buildPython "C:/path/to/python.exe"
        buildPython "C:/path/to/py.exe", "-3.8"
    }
}
  1. If you're facing Kotlin and Java compatibility issues, you can provide kotlin/java configuration as following:
android {
    compileSdk 34
    namespace 'com.chaquopy.chaquopy_example'

    kotlin {
        jvmToolchain(17)
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
}
  1. You might need to update dsitributionUrl for the gradle based on the version you're using, which you can do inside gradle-wrapper.properties. you can find the available gradle urls here:
distributionUrl=URL
  1. Future Plans :

    [ ] Add support for opencv and matplotlib

    [ ] Add support for NLTK and Spacy

    [ ] Add support for apple devices as well. If you want to help me out with it, kindly contact me,through mail, and I will be happy make this plugin better.

Demo :

Queries :

All the configurations of chaquopy will work the same way, it's mentioned on the chaquopy sdk home page. if you don't find any solution you can open issue in the repository and I am happy to help. :)