Metadata-Version: 2.4
Name: python2binary
Version: 0.2.0
Summary: Bundle a Python project into a native launcher for a host Python environment
Author-email: FauzanAriyatmoko <fauzan.ariyatmoko@gmail.com>
Project-URL: Homepage, https://github.com/FauzanAriyatmoko/python2binary
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: POSIX :: Linux
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

# python2binary 🚀

`python2binary` adalah CLI untuk membungkus source proyek Python menjadi satu executable launcher. Interpreter dan dependency tetap berasal dari environment Python pada mesin target, misalnya virtual environment (`venv`) aplikasi.

## Cara Kerja (Pipeline)

Program ini bekerja melalui tiga tahap utama:
1.  **Pack**: Membungkus semua file `.py` dalam proyek Anda menjadi arsip `.pyz` (zipapp).
2.  **Convert**: Mengubah file `.pyz` menjadi header C (`.h`) menggunakan `xxd`.
3.  **Compile**: Menghasilkan *launcher* C yang menyematkan data Python tersebut dan mengkompilasinya menggunakan `gcc` menjadi binary native.

Saat dijalankan, launcher menulis payload ke file temporer yang unik, menjalankannya dengan interpreter yang dipilih, meneruskan argumen dan sinyal, lalu menghapus payload tersebut.

## Prasyarat

Pada mesin build:

- Python 3.8+
- GCC
- XXD

Pada mesin target:

- Python yang kompatibel, biasanya dari venv aplikasi
- Semua dependency aplikasi sudah terinstal pada environment tersebut

GCC dan XXD hanya diperlukan saat build, bukan saat menjalankan binary.

```bash
sudo apt-get update
sudo apt-get install build-essential xxd
```

## Instalasi

Gunakan mode *editable* agar Anda dapat menjalankan perintah `python2binary` secara global di dalam venv Anda:

```bash
# Aktifkan venv Anda
source .binary/bin/activate

# Instal proyek
pip install -e .
```

## Penggunaan

```bash
python2binary \
  --project <direktori_proyek> \
  --entry <file_utama> \
  --output <folder_hasil> \
  [--name <nama_binary>] \
  [--python <path_interpreter>]
```

### Parameter

- `--project`, `-p`: Direktori root proyek Python.
- `--entry`, `-e`: Entry point relatif terhadap root, termasuk path bertingkat seperti `app/main.py`.
- `--output`, `-o`: Direktori artefak build.
- `--name`, `-n`: Nama binary; gunakan akhiran `.bin` jika diinginkan.
- `--python`: Interpreter fallback yang disimpan di launcher. Nilai default adalah `python3` dari `PATH`.

Interpreter saat runtime dipilih dengan urutan berikut:

1. Environment variable `PYTHON2BINARY_PYTHON`.
2. Nilai `--python` saat build.
3. `python3` dari `PATH` jika `--python` tidak diberikan.

Contoh binary yang dipetakan langsung ke venv:

```bash
python2binary \
  -p ./my_script_folder \
  -e app/main.py \
  -o ./dist \
  -n my_application.bin \
  --python /opt/my_application/.venv/bin/python

./dist/my_application.bin --port 8080
```

## Menjalankan melalui systemd

Path interpreter dapat ditentukan saat deployment tanpa membangun ulang binary:

```ini
[Unit]
Description=My Python Application
After=network.target

[Service]
Type=simple
User=myapp
WorkingDirectory=/opt/my_application
Environment="PYTHON2BINARY_PYTHON=/opt/my_application/.venv/bin/python"
ExecStart=/opt/my_application/my_application.bin
Restart=on-failure

[Install]
WantedBy=multi-user.target
```

Aktivasi venv dengan `source` tidak diperlukan di unit systemd karena path interpreter sudah eksplisit. Saat ini packager hanya memasukkan file `.py`; file konfigurasi, template, model, atau aset lain perlu tersedia terpisah pada `WorkingDirectory` aplikasi.

## Struktur Proyek

- `main.py`: Entry point CLI.
- `pipeline.py`: Logika utama orkestrasi pembangunan binary.
- `infrastructure/`: Implementasi teknis untuk packing, konversi, dan kompilasi.
- `interfaces/`: Definisi abstraksi untuk setiap tahapan pipeline.
- `schemas/`: Struktur data untuk konfigurasi dan hasil build.

## Lisensi
MIT
