Skip to content

Standardized Build and Distributuon Conditions for Tauri + PyO3 #9

@b-smiley

Description

@b-smiley

Overview

This plugin has a viable future for the Tauri community, I have been long awaiting a Python plugin like this. However, I feel as though there is still work to be done to make this plugin production-ready. I would like to start the conversation about standardizing the Python + PyO3 + Tauri development and production environments such that it can be easily distributed to end-users. PyO3 supports more Python libraries (CPython compilation) than RustPython, which is better for guaranteeing Tauri builds. Therefore, PyO3 is only discussed in this issue.

I have started looking into how to modify the test build github action provided by tauri actions to support pyo3 and this plugin. However, I figured this plugin community should create a standardized development process that aligns with Tauri's CI/CD pipeline for app distribution before I continue.

Feature Requests

Here are some things I think we need to develop and document better. I would be willing to contribute to these.

  • Local app development should use a python virtual environments by default.
    Using a venv is good practice in the Python community. The venv should be in a standardized location in the developer's app repository. Currently, I have mine external to the Tauri application, which I believe is the best for developing and distributing because it avoids copying issues inside GA.

    Image

    Inside main.py, I had to add the following:

      import sys
      import os
      
      if os.path.exists("../../venv/Lib/site-packages"):
          sys.path.append("../../venv/Lib/site-packages")
      else:
          print("Path does not exist, please check your virtual environment setup.", os.getcwd())
  • GitHub Actions Workflow - Copying libpython, venv 3rd party packages, and other python requirements into the build distribution.

    I have been reading through the pyo3 documentation, tauri documentation, and this plugin's documentation, but it has been a challenge to get the test build github action to work for all the OSs. The problem is that each OS uses venv and libpython differently (libpython3.10.dll vs. libpython3.10.dylib). Also, how would 3rd party python packages get properly distributed?

  • Source Code Protection

    I recognize that source code hiding can still be cracked, but storing the Python files in plain text in distribution is something I would like to avoid. I think this should at least be an option for developers to add to their applications. Give the developer the decision to open-source or close-source their application. Thus, I had 3 different ideas in mind for source code hiding:

    1. Obfuscate the .py files in GitHub Action using pyarmor OR another library.
    2. Encrypt .py files to prevent plain text snooping, then decrypt with a symmetric key stored with keyring on application boot.
      // py_lib_pyo3.rs
      // TODO Instead of passing in code:String as plain text, decrypt it first with keyring
      pub fn run_python_internal(code: String, _filename: String) -> crate::Result<()> {
          marker::Python::with_gil(|py| -> crate::Result<()> {
              let globals = GLOBALS.lock().unwrap().clone_ref(py).into_bound(py);
              let c_code = CString::new(code).expect("CString::new failed");
              Ok(py.run(&c_code, Some(&globals), None)?)
          })
      }
    3. Any other methods!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions