Bagaimana cara mendistribusikan program python?

102

Aplikasi saya terlihat seperti ini:

main.py
jendela /
    __init__.py
    mainwindow.py
    ...
model/
    __init__.py
    orders.py
    ...
sumber daya /
    gambar1.png
    logo.jpg
    ...

Program dimulai dengan main.py. Adakah cara yang baik untuk membuat aplikasi 'terakhir' darinya? Saya memikirkan sesuatu seperti py2exe / py2app, tetapi tanpa menyalin interpreter / modul python ke dalam aplikasi di mana seseorang hanya memiliki satu yang dapat dieksekusi.

Saya telah melihat distutils, tetapi ini sepertinya menginstal program ke direktori Python, yang tidak biasa pada platform non-linux.

Saat ini saya hanya menyalin seluruh folder sumber ke mesin target dan membuat alias ke main.pywdi windows. Beberapa ketidaknyamanan:

  • Ikon tersebut adalah ikon python default.
  • Saya harus membuat alias secara manual.
  • Di direktori sumber saya ada banyak file tambahan seperti folder kendali sumber.
  • Saya harus mengganti nama main.pymenjadi main.pywmanual.
  • Akan lebih baik jika hanya file `.pyo * yang ada di mesin target. Tidak ada alasan nyata untuk itu, saya hanya tidak suka memiliki file yang tidak perlu.

Bagaimana cara membuat distribusi otomatis yang bagus?

  • untuk windows? (Itulah satu-satunya platform yang harus saya dukung saat ini.)
  • untuk Mac?
  • untuk linux?
Georg Schölly
sumber
2
“Saya telah melihat distutils, tetapi ini sepertinya menginstal program ke direktori Python, yang tidak biasa pada platform non-linux.” Mengapa Anda mengatakan itu? Teks apa yang Anda baca yang mengatakan itu? Hal itu tentu tidak benar, darimana Anda mendapatkan kesan itu?
S. Lott

Jawaban:

37

Cara normal mendistribusikan aplikasi Python adalah dengan distutils . Itu dibuat untuk mendistribusikan modul pustaka jenis python, dan aplikasi python, meskipun saya tidak tahu cara kerjanya di Windows. Anda akan di Windows harus menginstal Python secara terpisah jika Anda menggunakan distutils, dalam hal apapun.

Saya mungkin akan merekomendasikan agar Anda mendistribusikannya dengan disutils untuk Linux, dan Py2exe atau yang serupa untuk Windows. Untuk OS X saya tidak tahu. Jika ini adalah aplikasi pengguna akhir, Anda mungkin menginginkan jenis gambar disk, saya tidak tahu bagaimana melakukannya. Tapi baca posting ini untuk informasi lebih lanjut tentang pengalaman pengguna itu. Untuk aplikasi yang dibuat untuk pemrogram Anda mungkin baik-baik saja dengan tipe distutils yang diinstal pada OS X juga.

Lennart Regebro
sumber
1
Mac dan linux tidak begitu penting saat ini. Py2app membuat bundel .app. Dan menurut saya pengiriman aplikasi mac dalam .dmg sudah usang, harus menggunakan .zip. Apakah mungkin menggunakan distutils untuk hanya membuat direktori distdan menyalin semua file yang relevan ke dalamnya ?
Georg Schölly
1
@gs: perintah sdist akan membuat file tar dari semua file sumber.
Martin v. Löwis
5
@gs: Mengirim aplikasi Mac dalam .dmg sebenarnya sangat umum. .dmg adalah image disk, dan bukan format untuk aplikasi (yaitu .app). Karenanya, Anda sering menemukan satu .app di dalam .dmg, bersama dengan beberapa file README.
Eric O Lebigot
2
@gs Saya tidak tahu mengapa Anda ingin distutils hanya membuat dist direktori dan menyalin file di sana, Anda dapat melakukannya sendiri. Distutils melakukan banyak hal, termasuk membuat installer windows, dan dari Python 2.6 juga membuat link di Start-menu. Ini akan mengharuskan Anda untuk menginstal Python secara terpisah, jadi untuk aplikasi pengguna akhir, saya pikir py2exe adalah solusi yang lebih baik, karena termasuk Python itu sendiri. Pengiriman / installer untuk OS X dibahas secara detail oleh Alexander Limi di bloggpost-nya, jadi saya tunduk padanya.
Lennart Regebro
61

Saya sangat merekomendasikan Pyinstaller , yang mendukung semua platform utama dengan cukup mulus. Seperti py2exe dan py2app, ini menghasilkan standar yang dapat dieksekusi pada Windows dan bundel aplikasi pada OS X, tetapi memiliki keuntungan juga melakukan pekerjaan yang fantastis untuk menyelesaikan dependensi umum secara otomatis dan menyertakannya tanpa penyesuaian konfigurasi tambahan.

Perhatikan juga bahwa jika Anda menerapkan Python 2.6 ke Windows, Anda harus menerapkan tambalan ini ke batang Pyinstaller.

Anda menyatakan bahwa Anda tidak memerlukan penginstal, tetapi Pengaturan Inno adalah pilihan pengaturan yang mudah digunakan dan cepat untuk platform Windows.

Daniel Naab
sumber
3
Saya tidak yakin itu berlebihan. Menggabungkan aplikasi dengan Pyinstaller sebenarnya bisa lebih mudah daripada metode lain, terutama yang memiliki ketergantungan pada ekstensi c ... sesederhana panggilan baris perintah satu baris dalam banyak kasus. Menginstal dependensi Python + + aplikasi itu sendiri (baik melalui distutils, dll, atau hanya file zip) lebih terlibat, terutama jika pengembang tidak dapat mengkonfigurasi sendiri mesin target secara manual dan perlu memberikan instruksi kepada klien. Setidaknya di Windows, menurut saya gaya distribusi itu masuk akal.
Daniel Naab
1
Sedikit tidak nyaman dengan pyinstaller, ketika Anda menggunakan executable yang dibuat dengan pyinstaller, awal eksekusi membutuhkan beberapa detik.
JuanPablo
1
Persis apa yang saya cari. Terkadang saya perlu membiarkan skrip saya berjalan di komputer yang tidak dapat saya instal apa pun. Satu yang dapat dieksekusi tanpa ketergantungan eksternal adalah yang saya butuhkan. Saya bisa meluangkan beberapa detik untuk memulai. Terima kasih!
CodeMonkey
Tidak disarankan untuk aplikasi kecil, karena Hello worldprogram sederhana membutuhkan ruang 500MB dan waktu inisialisasi 3-5 detik.
Raf
Anda dapat menghindari jumlah ruang ini dengan menggunakan lingkungan terpisah untuk mendistribusikan aplikasi Anda (Menggunakan venv atau pyenv, misalnya)
Alexander Santos
4

Fredrik Lundh squeeze.pydapat membuat satu file yang tidak berisi interpreter Python, melainkan berisi bytecode. Dengan argumen yang tepat, Anda dapat menyertakan file lain, modul, dll. Di file hasil. Saya berhasil menggunakannya dalam satu proyek. Program yang dihasilkan berjalan di OS X, Linux dan Windows tanpa masalah!

PS : Setiap mesin harus memiliki juru bahasa Python yang kompatibel dengan bytecode yang dihasilkan oleh squeeze.py. Anda dapat membuat versi bytecode yang berbeda untuk versi Python yang berbeda, jika perlu (jalankan saja squeeze.py dengan versi Python yang benar).

Eric O Lebigot
sumber
4

Saya pikir itu juga layak untuk menyebutkan PEX (mengingat lebih banyak perhatian yang diterima pertanyaan ini dan lebih sedikit pertanyaan itu sendiri). Menurut uraiannya sendiri :

File PEX adalah lingkungan virtual Python mandiri yang dapat dieksekusi. Lebih khusus lagi, mereka adalah file zip yang dibuat dengan hati-hati dengan a #!/usr/bin/env pythondan khusus __main__.pyyang memungkinkan Anda berinteraksi dengan runtime PEX. Untuk informasi lebih lanjut tentang aplikasi zip, lihat PEP 441 .

Saya tersandung saat membaca ikhtisar kemasan untuk python . Mereka memposting foto bagus ini di sana: masukkan deskripsi gambar di sini

Untuk meringkas: Jika Anda mampu mengandalkan python yang diinstal pada mesin target, gunakan PEX untuk menghasilkan »executable« mandiri yang mungkin akan memiliki ukuran file yang lebih kecil daripada yang dapat dieksekusi yang diproduksi oleh PyInstaller, misalnya.

pengguna3389669
sumber
1

Jika Anda mendistribusikan di windows, gunakan penginstal untuk menginstal semua file / interpeter yang relevan apa pun yang diperlukan. Distribusikan setup.exe. Itu cara terbaik di windows. Jika tidak, pengguna akan mengeluh.

Byron Whitlock
sumber
1
Saya tidak memerlukan penginstal karena hanya ada satu pengguna yang akan menggunakan program ini. Tetapi tentu saja saat menulis program untuk lebih banyak pengguna yang harus dimiliki di windows.
Georg Schölly
1
@gs: Oh, hanya satu pengguna. Baik, maka saya akan merekomendasikan membuat paket distutils dasar, baik distribusi sumber atau penginstal biner windows. Itu pasti cara yang mudah dan bagus untuk mendistribusikan modul Python.
Lennart Regebro
0

Cara paling mudah * lintas platform untuk mendistribusikan aplikasi desktop python adalah dengan mengandalkan pengelola paket conda lintas platform. Ada beberapa alat yang menggunakannya:

  • Miniconda-Install - skrip powershell / bash yang mengunduh otomatis Miniconda dan membuat lingkungan conda yang terisolasi untuk aplikasi. Mendukung pip tetapi tampaknya tidak terawat dan memiliki masalah unduhan https.
  • Proyek Anaconda dan (conda) konstruktor oleh Continuum. Keduanya menggunakan conda. (conda) konstruktor tampaknya dapat membuat penginstal mandiri dan bahkan penginstal NSIS di Windows tetapi tidak mendukung pip. Tampak berperilaku seperti pemasang Anaconda / Miniconda.
  • PyAppShare - pengguna akhir menginstal Miniconda / Anaconda terlebih dahulu (seperti lingkungan runtime). Kemudian skrip batch / bash instalasi tunggal membuat lingkungan conda terisolasi dari spesifikasi yaml. Aplikasi ini juga berupa paket conda / pip itu sendiri yang diinstal ke lingkungan dan titik masuk yang dapat dieksekusi dibuat. Pintasan Cross-platform Desktop dan Program secara otomatis dibuat. Mereka mengaktifkan lingkungan dan memulai aplikasi. Mendukung pip.

* Yang paling nyaman untuk pengembang. Cukup nyaman bagi pengguna akhir.

Peter Zagubisalo
sumber