Cara yang kuat untuk memastikan orang lain dapat menjalankan program python saya

17

Saya ingin menempatkan program python di GitHub dan meminta orang lain mengunduh dan menjalankannya di komputer mereka dengan berbagai macam sistem operasi. Saya relatif baru untuk python tetapi telah menggunakannya cukup untuk memperhatikan bahwa mendapatkan berbagai versi dari semua modul yang disertakan untuk bekerja bersama bisa bermasalah. Saya baru saja menemukan penggunaan requirements.txt(dihasilkan dengan pipreqsdan digunakan dengan perintah pip install -r /path/to/requirements.txt) tetapi sangat terkejut melihat bahwa requirements.txttidak benar-benar menyatakan versi python apa yang sedang digunakan jadi jelas itu bukan solusi lengkap sendiri. Jadi pertanyaan saya adalah: set spesifikasi / file / sesuatu-apa yang diperlukan untuk memastikan bahwa seseorang yang mengunduh proyek saya benar-benar dapat menjalankannya dengan masalah sesedikit mungkin.

EDIT: Rencana saya adalah untuk dipandu oleh jawaban mana saja yang paling banyak mendapat dukungan. Namun sejauh ini, setelah 4 jawaban dan 127 pandangan, tidak ada satu jawaban pun yang memiliki satu suara positif. Jika beberapa jawaban tidak baik, akan berguna untuk melihat beberapa komentar mengapa mereka tidak baik.

Mick
sumber
1
untuk masalah sesedikit mungkin, apakah Anda mempertimbangkan Docker (atau solusi berbasis wadah lainnya)? docker.com
Zaccharie Ramzi
Re: Docker ... Baru saja menemukan ini: "pengembang dapat yakin bahwa aplikasi akan berjalan pada mesin Linux lainnya" - tetapi saya ingin ini berfungsi pada OS apa pun. ( opensource.com/resources/what-docker )
Mick
Biasanya Anda memiliki dukungan untuk semua OS klasik: windows ( docs.docker.com/docker-for-windows ) dan mac ( docs.docker.com/docker-for-windows )
Zaccharie Ramzi
2
Jawabannya di sini sangat kontekstual. Apakah program Python melakukan hal-hal yang sysatau osatau jenis fungsi subproses atau lebih matematis / analitik? Yang pertama dapat berubah dengan setiap versi Python dan nantinya bisa menjadi versi yang cukup independen. Apa perpustakaan bergantung? numpy dan panda melakukan pekerjaan yang luar biasa di seluruh platform sehingga Anda bisa memastikan Anda memiliki versi min. Apa versi utama dari Python? Perbedaan antara Python 2.x dan 3.x dengan pustaka dependen menjadi lebih sulit. Jika Anda menulis kode yang baik menargetkan rilis besar umum yang merupakan awal yang baik.
dawg
2
Sebagaimana dibuktikan oleh segudang jawaban, ada begitu banyak cara untuk menyelesaikannya. Saya benar-benar ingin tahu apakah jawabannya akan berubah berdasarkan mengetahui apa aplikasi tersebut. Saya ingin percaya itu tidak masalah, tapi saya curiga itu bisa. Saya juga berpikir itu sangat tergantung pada audiens yang dituju. Fisika PhD cerdas yang menjalankan aplikasi pembelajaran mesin vs Joe internet memainkan permainan kartu catur.
Marcel Wilson

Jawaban:

15

Sudahkah Anda mempertimbangkan untuk menyiapkan setup.pyfile? Ini adalah cara praktis untuk menggabungkan semua ... pengaturan Anda dengan baik ke dalam satu lokasi. Jadi yang harus dilakukan pengguna Anda adalah A) mengkloning repo Anda dan B) jalankanpip install . untuk menjalankansetup.py

Ada banyak diskusi tentang hal ini.

Serta contoh pegangan yang ditulis oleh pria permintaan.

Ini harus mencakup sebagian besar kasus penggunaan. Sekarang jika Anda ingin membuatnya benar-benar dapat didistribusikan maka Anda ingin melihatnya pengaturannya di PyPi , pusat distribusi resmi.

Lebih dari itu jika Anda bertanya bagaimana membuat program "OS independen" tidak ada satu ukuran yang cocok untuk semua. Tergantung pada apa yang Anda lakukan dengan kode Anda. Membutuhkan penelitian tentang bagaimana kode khusus Anda berinteraksi dengan OS tersebut, dll.

Taylor Cochran
sumber
7

Ada banyak, banyak, banyak, banyak, banyak, banyak, banyak cara untuk melakukan ini. Saya akan membahas prinsip-prinsip di balik masing-masing, dan itu menggunakan case.

1. Lingkungan python

Ada banyak cara untuk melakukan ini. pipenv, conda,requirments.txt ,, dll.

Dengan beberapa di antaranya, Anda bisa menentukan versi python. Dengan yang lain, cukup tentukan rentang versi python yang Anda tahu berfungsi dengan baik - misalnya, jika Anda menggunakan python 3.7, sepertinya tidak akan mendukung 3.6; hanya ada satu atau dua perubahan kecil. 3,8 harus bekerja dengan baik.

Metode serupa lainnya adalah setup.py. Ini umumnya digunakan untuk mendistribusikan pustaka - seperti PyInstaller (solusi lain yang akan saya sebutkan di bawah), atau numpy, atau wxPython, atau PyQt5 dll - untuk impor / penggunaan perintah baris. Panduan pengemasan python cukup berguna, dan ada banyak tutorial di luar sana. (googlepython setup.py tutorial ) Anda juga dapat menentukan persyaratan dalam file-file ini.

2. Sebuah wadah

Docker adalah yang besar. Jika Anda belum pernah mendengarnya, saya akan terkejut. Google ringkasan cepat muncul dengan ini , yang akan saya kutip dari:

Jadi mengapa semua orang menyukai wadah dan Docker? James Bottomley, yang sebelumnya adalah CTO Parallels tentang virtualisasi server dan pengembang kernel Linux terkemuka, menjelaskan hypervisors VM, seperti Hyper-V, KVM, dan Xen, semua "didasarkan pada meniru perangkat keras virtual. Itu berarti mereka gemuk dalam hal Persyaratan sistem."

Namun, wadahnya menggunakan sistem operasi bersama. Ini berarti mereka jauh lebih efisien daripada hypervisor dalam hal sumber daya sistem. Alih-alih virtualisasi perangkat keras, kontainer lebih dari satu instance Linux. Ini berarti Anda dapat "meninggalkan sampah VM 99,9 persen yang tidak berguna, meninggalkan Anda dengan kapsul kecil rapi yang berisi aplikasi Anda,"

Itu seharusnya merangkumnya untuk Anda. (Perhatikan bahwa Anda tidak memerlukan OS khusus untuk wadah.)

3. File yang dapat dieksekusi

Ada 2 alat utama yang melakukan ini pada saat penulisan. PyInstaller, dan cx_Freeze. Keduanya dikembangkan secara aktif. Keduanya open source.

Anda mengambil skrip Anda, dan alat mengkompilasinya ke bytecode, menemukan impor, menyalinnya, dan menciptakan lingkungan python portabel yang menjalankan skrip Anda pada sistem target tanpa pengguna akhir membutuhkan python.

Secara pribadi, saya lebih suka PyInstaller - saya salah satu pengembang. PyInstaller menyediakan semua fungsinya melalui skrip baris perintah, dan mendukung sebagian besar pustaka yang dapat Anda pikirkan - dan dapat diperluas untuk mendukung lebih banyak. cx_Freeze membutuhkan skrip pengaturan.

Kedua alat mendukung windows, Linux, macOS, dan banyak lagi. PyInstaller dapat membuat exes file tunggal, atau bundel satu folder, sedangkan cx_Freeze hanya mendukung satu bundel folder. PyInstaller 3.6 mendukung python 2.7, dan 3.5-3.7 - tetapi 4.0 tidak mendukung python 2. cx_Freeze telah menjatuhkan dukungan python 2 pada rilis utama terakhir (6.0 saya pikir).

Lagi pula, cukup tentang fitur alat; Anda bisa melihatnya sendiri. (Lihat https://pyinstaller.org dan https://cx-freeze.readthedocs.io untuk info lebih lanjut)

Saat menggunakan metode distribusi ini, Anda biasanya memberikan kode sumber pada repo GitHub, beberapa exes (satu exes untuk setiap platform) yang siap untuk diunduh, dan instruksi tentang cara membuat kode menjadi file yang dapat dieksekusi.

Legorooj
sumber
1

Alat terbaik yang saya gunakan sejauh ini untuk ini adalah Pipenv . Tidak hanya menyatukan dan menyederhanakan seluruh alur kerja pip + virtualenv untuk Anda, pengembang, tetapi juga menjamin bahwa versi persis semua dependensi (termasuk Python sendiri) terpenuhi ketika orang lain menjalankan proyek Anda dengannya.

Situs web proyek melakukan pekerjaan yang cukup baik dalam menjelaskan cara menggunakan alat ini, tetapi, demi kelengkapan, saya akan memberikan penjelasan singkat di sini.

Setelah Anda menginstal Pipenv (misalnya, dengan menjalankan pip install --user pipenv), Anda dapat pergi ke direktori proyek Anda dan menjalankannya pipenv --python 3.7, jadi Pipenv akan membuat virtualenv baru untuk proyek Anda, membuat Pipfile dan Pipfile.lock (lebih lanjut tentang itu nanti) . Jika Anda melanjutkan dan menjalankannya pipenv install -r requirements.txtakan menginstal semua paket Anda. Sekarang Anda dapat melakukan pipenv shelluntuk mengaktifkan virtualenv baru Anda, atau pipenv run your_main_file.pyhanya menjalankan proyek Anda.

Sekarang mari kita lihat isi Pipfile Anda. Seharusnya sesuatu yang menyerupai ini:

[packages]
Django = "*"
djangorestframework = "*"
iso8601 = "*"
graypy = "*"
whitenoise = "*"

[requires]
python_version = "3.7"

File ini memiliki spesifikasi yang dapat dibaca manusia untuk dependensi proyek Anda (perhatikan bahwa ia juga menentukan versi Python). Jika requirement.txt Anda telah menyematkan versi, Pipfile Anda juga bisa memilikinya, tetapi Anda dapat dengan aman melakukan wildcard, karena versi persisnya disimpan di Pipfile.lock. Sekarang Anda dapat menjalankan hal-hal seperti pipenv updatememperbarui dependensi Anda dan jangan lupa untuk melakukan Pipfile dan Pipfile.lock ke VCS Anda.

Setelah orang mengkloning proyek Anda, yang harus mereka lakukan adalah menjalankan pipenv installdan Pipenv akan mengurus sisanya (bahkan mungkin menginstal versi Python yang benar untuk mereka).

Saya harap ini bermanfaat. Saya tidak berafiliasi dengan Pipenv, hanya ingin berbagi alat yang luar biasa ini.

gflorio
sumber
1

Jika program Anda kurang tentang GUI, atau memiliki GUI web, maka Anda dapat membagikan kode menggunakan Google Colaboratory.

https://colab.research.google.com/

Setiap orang dapat menjalankannya dengan lingkungan yang sama. Tidak perlu instalasi.

korakot
sumber
1

Jika mengubah semua skrip python Anda menjadi satu yang dapat dieksekusi dapat membantu Anda, maka jawaban saya di bawah ini akan membantu ...

Saya telah mengembangkan aplikasi desktop besar murni dalam python sejak 3 tahun. Ini adalah alat berbasis GUI yang dibangun di atas pustaka pyqt (python-binding dari kerangka QT C ++).

Saat ini saya menggunakan pustaka pengemasan " py2exe ": adalah ekstensi distutils yang memungkinkan untuk membangun program yang dapat dieksekusi Windows mandiri (32-bit dan 64-bit) dari skrip Python; yang harus Anda lakukan adalah:

  1. install py2exe: 'pip install py2exe'

  2. Buat skrip setup.py: Ini digunakan untuk menentukan konten EXE akhir (nama, ikon, penulis, file data, pustaka bersama, dll.)

  3. Jalankan: python setup.py py2exe

Saya juga menggunakan perangkat lunak "Inno Setup" untuk membuat pemasang: Membuat pintasan, mengatur variabel lingkungan, ikon, dll ...

Rida Shamasneh
sumber
py2exe belum diperbarui dalam beberapa tahun. Saya tidak dapat menemukan setiap aktifitas terbaru. Saya berasumsi, itu tidak terawat. (Juga, ini hanya mendukung python <3.4. Itu berarti hanya mendukung versi python yang sudah tidak berlaku lagi).
Legorooj
0

Saya pikir Anda dapat menggunakan buruh pelabuhan dengan python https://github.com/celery/celery/tree/master/docker

silakan ikuti file dan saya pikir Anda bisa mencari cara untuk membuat file buruh pelabuhan Anda untuk skrip python Anda!

auvipy
sumber
-1

Karena tidak ada jawaban lain, saya ingin menambahkan satu aspek yang sama sekali berbeda:

Pengujian unit. Atau pengujian secara umum.

Biasanya, ada baiknya memiliki satu konfigurasi yang dikenal baik. Tergantung pada apa dependensi programnya, Anda mungkin harus menguji berbagai kombinasi paket. Anda dapat melakukannya secara otomatis dengan mistox atau sebagai bagian dari pipa CI / CD.

Tidak ada aturan umum tentang kombinasi paket apa yang harus diuji, tetapi biasanya kompatibilitas python2 / 3 adalah masalah utama. Jika Anda memiliki ketergantungan yang kuat pada paket dengan perbedaan versi utama, Anda mungkin ingin mempertimbangkan pengujian terhadap versi yang berbeda ini.

Dschoni
sumber
Ini adalah aspek yang sangat penting dalam pengembangan perangkat lunak. Namun, ini sama sekali gagal menjawab pertanyaan . Bagaimana pengujian unit membantu distribusi suatu program?
Legorooj
IMHO, OP tidak secara khusus menanyakan tentang distribusi. Dia menanyakan beberapa cara untuk memastikan bahwa orang lain dapat menjalankan programnya. Saya pikir pengujian unit dapat benar-benar membantu melakukan itu, karena orang mungkin dibatasi dalam set paket yang dapat digunakan. Secara umum pertanyaan distribusi penting (dan telah dijawab di sini), tetapi saya pikir dalam skenario dunia nyata, kita tidak dapat mengandalkan pembuatan seluruh venv hanya untuk satu paket tunggal - perlu kompatibel dengan setidaknya beberapa konfigurasi standar.
Dschoni
Saya tidak membantah bahwa pengujian unit berharga untuk memastikan itu berjalan dengan benar, tetapi OP bertanya bagaimana cara membagi kode dengan cara "mudah dipasang". Itu sebabnya saya pikir ini adalah jawaban yang tidak valid - untuk pertanyaan khusus ini.
Legorooj
Saya masih berpikir pertanyaannya bukan hanya tentang distribusi. Itu sebabnya saya menambahkan jawaban ini. Jika Anda mengembangkan pada misalnya Windows, pengujian pada Unix sangat penting jika Anda ingin memastikan itu berjalan sebelum distribusi.
Dschoni
Karena penasaran, apa bedanya dengan apa yang baru saja saya katakan? ... making sure it runs correctly ...? Pengujian merupakan bagian penting dari memastikan itu berjalan dengan benar, oleh karena itu bagian penting dari mempersiapkan untuk mendistribusikannya, tapi masih tidak ada hubungannya dengan benar-benar mendistribusikan itu
Legorooj
-1

Saya akan memberi Anda ringkasan yang sangat singkat dari beberapa solusi yang ada saat ini untuk kemasan python yang dapat Anda pilih (pengetahuan adalah kekuatan):

  1. Ikuti panduan yang disediakan di Structure Your Project , konvensi ini diterima secara luas oleh komunitas python dan biasanya merupakan titik awal yang baik ketika pendatang baru mulai mengkodekan dengan python. Dengan mengikuti panduan ini, pythonis yang menonton proyek / sumber Anda di github atau tempat lain yang sejenis akan langsung tahu cara menginstalnya. Juga, mengunggah proyek Anda ke pypi dan menambahkan CI dengan mengikuti aturan-aturan itu tidak akan menyakitkan.

  2. Setelah proyek Anda terstruktur dengan benar sesuai dengan konvensi standar, langkah selanjutnya mungkin menggunakan beberapa freezer yang tersedia , jika Anda ingin mengirim kepada pengguna akhir Anda paket yang dapat mereka instal tanpa memaksa mereka untuk menginstal python pada paket mereka. mesin. Berhati-hatilah meskipun alat-alat ini tidak akan memberi Anda perlindungan kode ... dikatakan sebaliknya, mengekstraksi kode python asli dari artefak akhir akan sepele dalam semua kasus

  3. Jika Anda masih ingin mengirimkan proyek Anda ke pengguna Anda tanpa memaksa mereka untuk menginstal dependensi dev dan Anda juga peduli dengan perlindungan kode sehingga Anda tidak ingin mempertimbangkan freezer yang ada, Anda mungkin menggunakan alat seperti nuitka , shedskin , cython atau yang serupa. Biasanya membalikkan kode dari artefak yang dihasilkan oleh alat-alat ini sama sekali tidak sepele ... Perlindungan retak di sisi lain adalah masalah yang berbeda dan kecuali Anda tidak memberikan biner fisik kepada pengguna akhir Anda, Anda tidak dapat berbuat banyak tentang hal itu selain memperlambat mereka :)

  4. Juga, jika Anda perlu menggunakan bahasa eksternal dalam proyek python Anda, tautan klasik lain yang muncul di pikiran Anda adalah https://wiki.python.org/moin/IntegratingPythonWithOtherLanguages , menambahkan sistem pembuatan alat-alat tersebut ke CI dengan mengikuti aturan 1 akan sangat mudah.

Yang mengatakan, saya akan menyarankan menempel pada bulletpoint 1 karena saya tahu itu akan lebih dari cukup baik untuk Anda mulai, juga bahwa titik tertentu harus mencakup banyak kasus penggunaan yang ada untuk proyek "standar" python.

Meskipun ini tidak dimaksudkan untuk menjadi panduan lengkap dengan mengikuti yang Anda akan dapat mempublikasikan proyek python Anda kepada massa dalam waktu singkat.

BPL
sumber