Dokumen ini disarankan untuk dibaca pertama kali saat Anda mulai menggunakan Nuitka . Di halaman ini, Anda akan mempelajari lebih lanjut tentang dasar-dasar Nuitka , seperti jenis lisensi, kasus penggunaan, persyaratan, dan kredit.
Daftar isi
Persyaratan
Penggunaan
Tutorial Setup dan membangun pada Windows
Kasus Penggunaan
Perubahan
Masalah Khas
Kiat
Laporan Kompilasi
Pertunjukan
Fungsionalitas tidak didukung
Nuitka adalah kompiler Python. Itu ditulis dengan Python. Ini adalah pengganti atau ekstensi yang mulus untuk juru bahasa Python dan mengkompilasi setiap konstruksi yang dimiliki Python 2 (2.6, 2.7) dan Python 3 (3.4 - 3.13), ketika dijalankan dengan versi Python tersebut.
Ia kemudian mengeksekusi kode yang belum dikompilasi dan kode yang dikompilasi bersama-sama dengan cara yang sangat kompatibel.
Anda dapat menggunakan semua modul perpustakaan Python dan semua modul ekstensi secara bebas.
Nuitka menerjemahkan modul Python ke dalam program tingkat C yang kemudian menggunakan libpython
dan file C statisnya sendiri untuk dieksekusi dengan cara yang sama seperti yang dilakukan CPython.
Semua pengoptimalan ditujukan untuk menghindari overhead, yang tidak diperlukan. Tidak ada yang ditujukan untuk menghilangkan kompatibilitas, meskipun sedikit perbaikan kadang-kadang akan dilakukan, di mana tidak setiap bug standar Python ditiru, misalnya pesan kesalahan yang lebih lengkap diberikan, tetapi ada mode kompatibilitas penuh untuk menonaktifkannya.
Untuk memastikan kelancaran pengoperasian Nuitka , pastikan untuk mengikuti persyaratan sistem, yang mencakup komponen berikut:
Kompiler C
ular piton
Sistem Operasi
Arsitektur
Anda memerlukan kompiler C dengan dukungan untuk C11 atau alternatifnya kompiler C++ untuk C++03 [1].
Saat ini, ini berarti, Anda perlu menggunakan salah satu kompiler berikut:
Kompiler MinGW64 C11, di Windows, harus berbasis gcc 11.2 atau lebih tinggi. Ini akan diunduh secara otomatis jika tidak ditemukan kompiler C yang dapat digunakan, yang merupakan cara yang disarankan untuk menginstalnya, karena Nuitka juga akan memutakhirkannya untuk Anda.
Visual Studio 2022 atau lebih tinggi di Windows [2]. Paket bahasa Inggris untuk hasil terbaik (Nuitka menyaring keluaran sampah, tetapi hanya untuk bahasa Inggris). Ini akan digunakan secara default jika diinstal.
Di semua platform lain, kompiler gcc
minimal versi 5.1, dan di bawahnya kompiler g++
minimal versi 4.4 sebagai alternatif.
Kompiler clang
pada macOS X dan sebagian besar arsitektur FreeBSD.
Di Windows, kompiler clang-cl
di Windows dapat digunakan jika disediakan oleh penginstal Visual Studio.
[1] | Dukungan untuk C11 ini diberikan dengan gcc 5.x atau lebih tinggi atau versi dentang apa pun. Kompiler MSVC lama belum melakukannya. Namun sebagai solusinya, dengan Python 3.10 atau yang lebih lama, standar bahasa C++03 secara signifikan tumpang tindih dengan C11, sehingga digunakan sebagai gantinya. |
[2] | Unduh secara gratis dari https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx (edisi komunitas berfungsi dengan baik). Versi terbaru disarankan, tetapi tidak wajib. Di sisi lain, tidak perlu kecuali untuk mendukung versi sebelum Windows 10, dan versi tersebut mungkin cocok untuk Anda, tetapi dukungan konfigurasi ini hanya tersedia untuk pengguna komersial. |
Python 2 (2.6, 2.7) dan Python 3 (3.4 — 3.13) didukung. Jika suatu saat, ada rilis Python stabil yang tidak ada dalam daftar ini, yakinlah bahwa rilis tersebut sedang dikerjakan dan akan ditambahkan.
Penting
Untuk Python 3.4 dan hanya versi itu, kita memerlukan versi Python lain sebagai ketergantungan waktu kompilasi .
Nuitka sendiri sepenuhnya kompatibel dengan semua versi yang terdaftar, namun Scons sebagai alat yang digunakan secara internal tidak.
Untuk versi ini, Anda juga perlu menginstal Python2 atau Python 3.5 atau lebih tinggi, tetapi hanya selama waktu kompilasi. Itu untuk digunakan dengan Scons (yang mengatur kompilasi C), yang tidak mendukung versi Python yang sama seperti Nuitka.
Selain itu, di Windows, Python2 tidak dapat digunakan karena clcache
tidak berfungsi, sehingga Python 3.5 atau lebih tinggi perlu diinstal.
Nuitka menemukan versi Python yang diperlukan ini (misalnya di Windows melalui registri) dan Anda tidak akan menyadarinya selama versi tersebut diinstal.
Semakin banyak fungsi lain yang tersedia ketika Python lain menginstal paket tertentu. Misalnya, kompresi satu file akan berfungsi untuk Python 2.x ketika Python lain ditemukan yang telah menginstal paket zstandard
.
Memindahkan biner ke mesin lain
Biner yang dibuat dapat dibuat dapat dieksekusi secara independen dari instalasi Python, dengan opsi --standalone
dan --onefile
.
Akhiran nama file biner
Biner yang dibuat memiliki akhiran .exe
di Windows. Di platform lain, mereka tidak memiliki akhiran untuk mode mandiri, atau akhiran .bin
, yang dapat Anda hapus atau ubah dengan bebas, atau tentukan dengan opsi -o
.
Akhiran untuk mode akselerasi ditambahkan hanya untuk memastikan bahwa nama skrip asli dan nama biner tidak pernah bertabrakan, sehingga kita dapat menimpa biner dengan aman tanpa merusak file sumber aslinya.
Itu harus CPython, Anaconda Python, atau Homebrew
Anda memerlukan implementasi Python standar, yang disebut "CPython", untuk mengeksekusi Nuitka karena terkait erat dengan detail implementasinya.
Itu tidak bisa dari toko aplikasi Windows
Diketahui bahwa toko aplikasi Windows Python pasti tidak berfungsi, sudah diperiksa.
Itu tidak bisa pyenv di macOS
Diketahui bahwa macOS "pyenv" tidak berfungsi. Gunakan Homebrew sebagai gantinya untuk instalasi Python yang dikompilasi sendiri. Namun perlu diingat bahwa mode mandiri akan lebih buruk pada platform ini dan tidak kompatibel dengan versi macOS yang lebih lama.
Sistem Operasi yang Didukung: Linux, FreeBSD, NetBSD, macOS, dan Windows (32 bit/64 bit/ARM).
Yang lain juga akan bekerja. Portabilitasnya diharapkan secara umum baik, tetapi misalnya penggunaan Scons internal Nuitka mungkin harus diadaptasi atau perlu dilewati. Pastikan untuk mencocokkan arsitektur kompiler Python dan C, atau Anda akan mendapatkan pesan kesalahan samar.
Arsitektur yang Didukung adalah x86, x86_64 (amd64), dan arm, kemungkinan masih banyak lagi.
Arsitektur lain diharapkan juga berfungsi, karena Nuitka umumnya tidak menggunakan spesifikasi perangkat keras apa pun. Ini hanyalah yang diuji dan diketahui bagus. Umpan balik diterima. Secara umum, arsitektur yang didukung Debian juga dianggap bagus dan teruji.
Cara yang disarankan untuk mengeksekusi Nuitka adalah <the_right_python> -m nuitka
untuk benar-benar yakin interpreter Python mana yang Anda gunakan, sehingga lebih mudah untuk mencocokkan dengan apa yang dimiliki Nuitka.
Cara terbaik berikutnya untuk mengeksekusi Nuitka adalah dari checkout sumber atau arsip, tanpa perubahan variabel lingkungan, yang paling penting, Anda tidak perlu mengotak-atik PYTHONPATH
sama sekali untuk Nuitka. Anda cukup menjalankan skrip nuitka
dan nuitka-run
secara langsung tanpa perubahan apa pun pada lingkungan. Anda mungkin ingin menambahkan direktori bin
ke PATH
Anda untuk kenyamanan Anda, tapi langkah itu opsional.
Selain itu, jika Anda ingin mengeksekusi dengan juru bahasa yang tepat, dalam hal ini, pastikan untuk mengeksekusi <the_right_python> bin/nuitka
dan jadilah baik.
Pilih Penerjemah yang tepat
Jika Anda menemukan SyntaxError
Anda pasti telah memilih penerjemah yang salah untuk program yang Anda kompilasi.
Nuitka memiliki opsi --help
untuk menampilkan apa yang dapat dilakukannya:
nuitka --membantu
Perintah nuitka-run
sama dengan nuitka
, tetapi dengan default yang berbeda. Ia mencoba mengkompilasi dan langsung mengeksekusi skrip Python:
nuitka-lari --membantu
Opsi yang berbeda ini adalah --run
, dan meneruskan argumen setelah non-opsi pertama ke biner yang dibuat, sehingga lebih mirip dengan apa yang akan dilakukan python
biasa.
Untuk sebagian besar sistem, akan ada paket di halaman download Nuitka. Namun Anda juga dapat menginstalnya dari kode sumber seperti dijelaskan di atas, tetapi seperti program Python lainnya, program ini dapat diinstal melalui rutin python setup.py install
yang normal.
Pemberitahuan untuk integrasi dengan alur kerja GitHub, ada Nuitka-Action yang harus Anda gunakan yang membuatnya sangat mudah untuk diintegrasikan. Anda harus memulai dengan kompilasi lokal, tetapi ini akan lebih mudah untuk kompilasi lintas platform dengan Nuitka.
Nuitka dilisensikan di bawah Lisensi Apache, Versi 2.0; Anda tidak boleh menggunakannya kecuali sesuai dengan Lisensi.
Anda dapat memperoleh salinan Lisensi di http://www.apache.org/licenses/LICENSE-2.0
Kecuali diwajibkan oleh undang-undang yang berlaku atau disetujui secara tertulis, perangkat lunak yang didistribusikan berdasarkan Lisensi didistribusikan berdasarkan DASAR "APA ADANYA", TANPA JAMINAN ATAU KETENTUAN DALAM BENTUK APAPUN, baik tersurat maupun tersirat. Lihat Lisensi untuk bahasa tertentu yang mengatur izin dan batasan berdasarkan Lisensi.
Ini adalah langkah dasar jika Anda belum menginstal apa pun, tentu saja jika Anda memiliki bagian apa pun, lewati saja.
Unduh dan instal Python dari https://www.python.org/downloads/windows
Pilih salah satu Windows x86-64 web-based installer
(disarankan Python 64 bit) atau penginstal x86 executable
(Python 32 bit).
Verifikasi itu berfungsi menggunakan perintah python --version
.
python -m pip install nuitka
Verifikasi menggunakan perintah python -m nuitka --version
mkdir
Halo Dunia
buat file python bernama hello.py
def bicara(pesan):kembalikan "Bicara " + pesandef main():print(bicara("Halo Dunia"))if __name__ == "__main__":main()
Lakukan seperti biasa. Menjalankan Nuitka pada kode yang tidak berfungsi dengan benar tidak mudah untuk di-debug.
python halo.py
python -m nuitka halo.py
Catatan
Ini akan meminta Anda mengunduh alat caching C (untuk mempercepat kompilasi berulang kode C yang dihasilkan) dan kompiler C berbasis MinGW64, kecuali Anda telah menginstal MSVC yang sesuai. Katakan yes
untuk kedua pertanyaan itu.
Jalankan hello.exe
yang dibuat di dekat hello.py
.
Untuk mendistribusikan, buat dengan opsi --standalone
, yang tidak akan menghasilkan satu folder yang dapat dieksekusi, tetapi seluruh folder. Salin folder hello.dist
yang dihasilkan ke komputer lain dan jalankan.
Anda juga dapat mencoba --onefile
yang membuat satu file, tetapi pastikan bahwa file mandiri tersebut berfungsi, sebelum beralih ke file tersebut, karena ini hanya akan mempersulit proses debug, misalnya jika ada file data yang hilang.
Jika Anda ingin mengkompilasi seluruh program secara rekursif, dan bukan hanya satu file yang merupakan program utama, lakukan seperti ini:
python -m nuitka --ikuti-impor program.py
Catatan
Ada kontrol yang lebih detail daripada --follow-imports
yang tersedia. Pertimbangkan keluaran nuitka --help
. Memasukkan lebih sedikit modul ke dalam kompilasi, tetapi menggunakan Python biasa, akan membuatnya lebih cepat untuk dikompilasi.
Jika Anda memiliki direktori sumber dengan file yang dimuat secara dinamis, yaitu direktori yang tidak dapat ditemukan dengan mengulangi pernyataan import normal melalui PYTHONPATH
(yang merupakan cara yang disarankan), Anda selalu dapat meminta agar direktori tertentu juga harus disertakan dalam dapat dieksekusi:
python -m nuitka --follow-imports --include-plugin-directory=plugin_dir program.py
Catatan
Jika Anda tidak melakukan impor dinamis apa pun, cukup mengatur PYTHONPATH
Anda pada waktu kompilasi adalah hal yang harus Anda lakukan.
Gunakan --include-plugin-directory
hanya jika Anda membuat __import__()
panggilan yang tidak dapat diprediksi oleh Nuitka, dan berasal dari direktori, untuk semuanya dari instalasi Python Anda, gunakan --include-module
atau --include-package
.
Catatan
Nama file yang dihasilkan akan menjadi program.exe
di Windows, program.bin
di platform lain, tetapi --output-filename
memungkinkan perubahan itu.
Catatan
Biner yang dihasilkan masih bergantung pada CPython dan menggunakan modul ekstensi C yang sedang diinstal.
Jika Anda ingin dapat menyalinnya ke komputer lain, gunakan --standalone
dan salin direktori program.dist
yang dibuat dan jalankan program.exe
(Windows) atau program
(platform lain) yang dimasukkan ke dalamnya.
Jika Anda ingin mengkompilasi satu modul ekstensi, yang harus Anda lakukan adalah ini:
python -m nuitka --module some_module.py
File yang dihasilkan some_module.so
kemudian dapat digunakan sebagai pengganti some_module.py
.
Penting
Nama file dari modul ekstensi yang dihasilkan tidak boleh diubah karena Python bersikeras pada fungsi turunan nama modul sebagai titik masuk, dalam hal ini PyInit_some_module
dan mengganti nama file tidak akan mengubahnya. Cocokkan nama file kode sumber dengan nama biner yang seharusnya.
Catatan
Jika modul ekstensi dan kode sumbernya berada di direktori yang sama, modul ekstensi akan dimuat. Perubahan pada kode sumber hanya berpengaruh setelah Anda mengkompilasi ulang.
Catatan
Opsi --follow-import-to
juga berfungsi, tetapi modul yang disertakan hanya dapat diimpor setelah Anda mengimpor nama some_module
. Jika jenis impor ini tidak terlihat oleh Nuitka, misalnya dibuat secara dinamis, Anda dapat menggunakan --include-module
atau --include-package
dalam kasus tersebut, namun untuk impor statis hal ini tidak diperlukan.
Catatan
Modul ekstensi tidak boleh menyertakan modul ekstensi lainnya. Anda harus membuat roda agar hal ini dapat dilakukan.
Catatan
Modul ekstensi yang dihasilkan hanya dapat dimuat ke CPython dengan versi yang sama dan tidak menyertakan modul ekstensi lainnya.
Jika Anda perlu mengkompilasi seluruh paket dan menyematkan semua modul, itu juga memungkinkan, gunakan Nuitka seperti ini:
python -m nuitka --module some_package --include-package=some_package
Catatan
Pencantuman isi paket perlu disediakan secara manual; jika tidak, sebagian besar paket kosong. Anda bisa lebih spesifik jika mau, dan hanya menyertakan sebagian saja, atau mengecualikan sebagian saja, misalnya dengan --nofollow-import-to='*.tests'
Anda tidak akan menyertakan bagian pengujian yang tidak terpakai pada kode Anda.
Catatan
File data yang terletak di dalam paket tidak akan disematkan oleh proses ini, Anda perlu menyalinnya sendiri dengan pendekatan ini. Alternatifnya, Anda dapat menggunakan penyematan file komersial Nuitka.
Untuk distribusi ke sistem lain, terdapat mode mandiri, yang menghasilkan folder yang dapat Anda tentukan --standalone
.
python -m nuitka --program mandiri.py
Mengikuti semua impor adalah default dalam mode ini. Anda dapat mengecualikan modul secara selektif dengan mengatakan secara khusus --nofollow-import-to
, tetapi kemudian ImportError
akan dimunculkan ketika impor modul tersebut dilakukan pada waktu program dijalankan. Hal ini mungkin menyebabkan perilaku yang berbeda, namun juga dapat meningkatkan waktu kompilasi Anda jika dilakukan dengan bijak.
Agar file data dapat disertakan, gunakan opsi --include-data-files=<source>=<target>
yang mana sumbernya adalah jalur sistem file, namun targetnya harus ditentukan secara relatif. Untuk mode mandiri, Anda juga dapat menyalinnya secara manual, tetapi ini dapat melakukan pemeriksaan tambahan, dan untuk mode satu file, tidak ada kemungkinan penyalinan manual.
Untuk menyalin beberapa atau semua file dalam direktori, gunakan opsi --include-data-files=/etc/*.txt=etc/
di mana Anda dapat menentukan pola shell untuk file tersebut, dan subdirektori tempat meletakkannya, ditunjukkan oleh garis miring berikutnya.
Penting
Nuitka tidak menganggap kode file data, tidak menyertakan DLL, atau file Python sebagai file data, dan mengharapkannya berfungsi, mereka tidak akan melakukannya, kecuali Anda benar-benar tahu apa yang Anda lakukan.
Berikut ini, file data non-kode adalah semua file yang tidak cocok dengan kriteria ini.
Akhiran | Alasan | Larutan |
---|---|---|
.py | Nuitka bahkan memangkas modul stdlib untuk disertakan. Jika tidak melihat kode Python, tidak ada dependensi yang dianalisis, dan akibatnya kode tersebut tidak akan berfungsi. | Gunakan --include-module sebagai gantinya |
.pyc | Sama seperti .py . | Gunakan --include-module dari kode sumbernya. |
.pyo | Sama seperti .pyc . | Gunakan --include-module dari kode sumbernya. |
.pyw | Sama seperti .py . | Untuk menyertakan beberapa program, gunakan beberapa argumen --main sebagai gantinya. |
.pyi | Ini diabaikan, karena seperti kode dan tidak diperlukan pada saat dijalankan. Untuk paket lazy yang sebenarnya bergantung padanya, kami membuat solusi waktu kompilasi yang menghilangkan kebutuhan. | Ajukan masalah jika perangkat lunak bagian ke-3 memerlukannya. |
.pyx | Ini diabaikan karena merupakan kode sumber Cython yang tidak digunakan saat dijalankan | |
.dll | Ini diabaikan, karena biasanya bukan file data. Untuk kasus di mana paket pihak ketiga benar-benar menggunakannya sebagai data, misalnya paket .NET , kami menyelesaikannya dalam konfigurasi paket untuk paket tersebut. | Buat konfigurasi Paket Nuitka untuk itu, dengan bagian dll untuk paket yang menggunakannya. Untuk kasus yang jarang terjadi, bagian file data dengan konfigurasi khusus mungkin merupakan hal yang benar untuk dilakukan. |
.dylib | Ini diabaikan, karena merupakan modul ekstensi MacOS atau DLL. | Perlu menambahkan konfigurasi dengan bagian dll atau depends yang hilang |
.so | Ini diabaikan, karena merupakan modul ekstensi atau DLL Linux, BSD, dll. | Perlu menambahkan konfigurasi dengan bagian dll atau depends yang hilang |
.exe | Itu adalah biner ke Windows. | Anda dapat menambahkan konfigurasi Paket Nuitka untuk memasukkannya sebagai DLL dan menandainya sebagai executable: yes |
.bin | Ini adalah biner untuk non-Windows, sama seperti .exe . |
Folder juga diabaikan, ini adalah site-packages
, dist-packages
dan vendor-packages
yang seharusnya menyertakan virtualenv lengkap, yang bukanlah hal yang baik untuk terjadi. Dan folder __pycache__
juga selalu diabaikan. Di non-MacOS, file .DS_Store
juga diabaikan, dan folder py.typed
hanya memiliki arti untuk IDE, dan diabaikan seperti file .pyi
.
Untuk menyalin seluruh folder dengan semua file non-kode, Anda dapat menggunakan --include-data-dir=/path/to/images=images
yang akan menempatkannya di tujuan, dan jika Anda ingin menggunakan --noinclude-data-files
opsi --noinclude-data-files
untuk menghapusnya. File kode seperti yang dirinci di atas DLL, executable, file Python, dll. dan akan diabaikan. Untuk itu, Anda dapat menggunakan formulir --include-data-files=/binaries/*.exe=binary/
untuk memaksanya, tetapi hal itu tidak disarankan dan diketahui menyebabkan masalah pada saat run-time.
Untuk data paket, ada cara yang lebih baik, yaitu menggunakan --include-package-data
, yang mendeteksi semua file data non-kode dari paket secara otomatis dan menyalinnya. Ia bahkan menerima pola dalam gaya shell. Ini membuat Anda tidak perlu mencari sendiri direktori paket dan sebaiknya dipilih kapan pun tersedia. Secara fungsional ini sangat mirip dengan --include-data-dir
tetapi memiliki manfaat untuk menemukan folder yang tepat untuk Anda.
Dengan file data, sebagian besar Anda sendirian. Nuitka melacak paket-paket yang dibutuhkan oleh paket-paket populer, tetapi mungkin tidak lengkap. Ajukan masalah jika Anda menemukan sesuatu di dalamnya. Lebih baik lagi, tingkatkan PR dengan penyempurnaan pada konfigurasi paket Nuitka. Kami ingin perangkat lunak pihak ketiga langsung berfungsi.
Jika berhasil, Anda dapat menggunakan mode onefile jika diinginkan.
python -m nuitka --onefile program.py
Ini akan membuat biner tunggal, yang mengekstraksi dirinya sendiri pada target, sebelum menjalankan program. Namun perhatikan, bahwa mengakses file yang berhubungan dengan program Anda terpengaruh, pastikan untuk membaca bagian Onefile: Menemukan file juga.
# Buat biner yang dibongkar ke dalam folder sementarapython -m nuitka --onefile program.py
Catatan
Ada lebih banyak opsi khusus platform, misalnya terkait dengan ikon, layar pembuka, dan informasi versi, pertimbangkan keluaran --help
untuk detailnya dan periksa bagian Tweaks.
Untuk membongkar, secara default jalur sementara pengguna unik digunakan, dan kemudian dihapus, namun default --onefile-tempdir-spec="{TEMP}/onefile_{PID}_{TIME}"
ini dapat diganti dengan jalur spesifikasi, kemudian menggunakan jalur cache, menghindari pembongkaran berulang, misalnya dengan --onefile-tempdir-spec="{CACHE_DIR}/{COMPANY}/{PRODUCT}/{VERSION}"
yang menggunakan versi informasi, dan direktori cache khusus pengguna.
Catatan
Menggunakan jalur yang di-cache akan relevan, misalnya ketika Windows Firewall mulai digunakan karena jika tidak, biner akan menjadi biner yang berbeda setiap kali dijalankan.
Saat ini, token yang diperluas ini tersedia:
Token | Apa yang Diperluas ini | Contoh |
---|---|---|
{TEMP} | Direktori file sementara pengguna | C:Pengguna...AppDataLocalsTemp |
{PID} | ID Proses | 2772 |
{WAKTU} | Waktu dalam hitungan detik sejak zaman. | 1299852985 |
{PROGRAM} | Nama file run-time program lengkap yang dapat dieksekusi. | C:SomeWhereYourOnefile.exe |
{PROGRAM_BASE} | Tidak ada akhiran nama file run-time yang dapat dieksekusi. | C:SomeWhereYourOnefile |
{CACHE_DIR} | Direktori cache untuk pengguna. | C:UsersSomeBodyAppDataLokal |
{PERUSAHAAN} | Nilai yang diberikan sebagai --company-name | Nama Perusahaan Anda |
{PRODUK} | Nilai yang diberikan sebagai --product-name | NamaProduk Anda |
{VERSI} | Kombinasi --file-version & --product-version | 3.0.0.0-1.0.0.0 |
{RUMAH} | Direktori beranda untuk pengguna. | /rumah/seseorang |
{TIDAK ADA} | Ketika disediakan untuk keluaran file, None yang digunakan | lihat pemberitahuan di bawah |
{BATAL} | Ketika disediakan untuk keluaran file, os.devnull digunakan | lihat pemberitahuan di bawah |
Penting
Merupakan tanggung jawab Anda untuk membuat jalur yang disediakan unik, di Windows program yang sedang berjalan akan dikunci, dan meskipun menggunakan nama folder tetap dimungkinkan, hal ini dapat menyebabkan masalah penguncian jika program dimulai ulang.
Biasanya, Anda perlu menggunakan {TIME}
atau setidaknya {PID}
untuk membuat jalur menjadi unik, dan ini terutama ditujukan untuk kasus penggunaan, misalnya Anda ingin sesuatu berada di tempat yang Anda pilih atau mematuhi konvensi penamaan Anda.
Penting
Untuk menonaktifkan output dan stderr dengan --force-stdout-spec
dan --force-stderr-spec
nilai {NONE}
dan {NULL}
mencapainya, tetapi dengan efek yang berbeda. Dengan {NONE}
, pegangan yang sesuai menjadi None
. Hasilnya, misalnya sys.stdout
akan menjadi None
, yang berbeda dari {NULL}
yang mana ia akan didukung oleh file yang menunjuk ke os.devnull
, yaitu Anda dapat menulis ke sana.
Dengan {NONE}
, misalnya Anda mungkin mendapatkan RuntimeError: lost sys.stdout
jika digunakan; dengan {NULL}
itu tidak pernah terjadi. Namun, beberapa perpustakaan menangani ini sebagai masukan untuk mekanisme logging mereka, dan di Windows inilah cara Anda kompatibel dengan pythonw.exe
yang berperilaku seperti {NONE}
.
Jika Anda memiliki pembuatan roda yang digerakkan oleh setup.py
, setup.cfg
atau pyproject.toml
untuk perangkat lunak Anda, menggunakan Nuitka sangatlah mudah.
Mari kita mulai dengan pendekatan setuptools
yang paling umum, Anda tentu saja dapat, setelah menginstal Nuitka, cukup jalankan target bdist_nuitka
daripada bdist_wheel
. Ini mengambil semua opsi dan memungkinkan Anda menentukan lebih banyak lagi, yang khusus untuk Nuitka.
# Untuk setup.py jika Anda tidak menggunakan sistem build lain:setup( # File data harus ditangani oleh setuptools dan bukan Nuitka paket_data={"some_package": ["some_file.txt"]}, ..., # Ini untuk meneruskan opsi Nuitka. command_options={ 'nuitka': { # opsi boolean, misalnya jika Anda menggunakan perintah kompilasi C '--show-scons': Benar, # opsi tanpa nilai, misalnya menerapkan menggunakan Dentang '--clang': Tidak ada, # opsi dengan nilai tunggal, misalnya aktifkan plugin Nuitka '--enable-plugin': "pyside2", # opsi dengan beberapa nilai, misalnya hindari menyertakan modul '--nofollow-import-to' : ["*.tes", "*.distutils"], }, }, )# Untuk setup.py dengan sistem build lain:# Sifat tupel dari argumen diperlukan oleh sifat gelap dari# "setuptools" dan pluginnya, yang menuntut kompatibilitas penuh,# misalnya "setuptools_rust"setup( # File data harus ditangani oleh setuptools dan bukan Nuitka paket_data={"some_package": ["some_file.txt"]}, ..., # Ini untuk meneruskan opsi Nuitka. ..., command_options={ 'nuitka': { # opsi boolean, misalnya jika Anda menggunakan perintah kompilasi C '--show-scons': ("setup.py", True), # opsi tanpa nilai, misalnya terapkan menggunakan Dentang '--clang': ("setup.py", Tidak Ada), # opsi dengan nilai tunggal, misalnya aktifkan plugin Nuitka '--enable-plugin': ("setup.py", "pyside2"), # pilihan dengan beberapa nilai, misalnya hindari menyertakan modul '--nofollow-import-to' : ("setup.py", ["*.tests", "*.distutils"]), } }, )
Jika karena alasan tertentu, Anda tidak dapat atau tidak ingin mengubah target, Anda dapat menambahkan ini ke setup.py
Anda.
# Untuk setup.pysetup( ..., build_with_nuitka=Benar)
Catatan
Untuk menonaktifkan sementara kompilasi, Anda dapat menghapus baris di atas, atau mengedit nilainya menjadi False
atau mengambil nilainya dari variabel lingkungan jika Anda mau, misalnya bool(os.getenv("USE_NUITKA", "True"))
. Ini terserah Anda.
Atau Anda bisa memasukkannya ke setup.cfg
Anda
[metadata]build_with_nuitka = benar
Dan yang terakhir, namun tidak kalah pentingnya, Nuitka juga mendukung meta build
baru, jadi ketika Anda sudah memiliki pyproject.toml
, cukup ganti atau tambahkan nilai ini:
[build-system]requires = ["setuptools>=42", "wheel", "nuitka", "toml"]build-backend = "nuitka.distutils.Build"# File data harus ditangani oleh setuptools dan bukan Nuitka [alat.setuptools.package-data]some_package = ['data_file.txt'] [tool.nuitka]# Ini tidak direkomendasikan, tapi membuatnya jelas berpengaruh.# opsi boolean, misalnya jika Anda menggunakan perintah kompilasi C, # tanda hubung di depan dihilangkanshow-scons = true# opsi dengan nilai tunggal, misalnya aktifkan sebuah plugin Nuitkaenable-plugin = "pyside2"# opsi dengan beberapa nilai, misalnya hindari menyertakan modul, terima# list argument.nofollow-import-to = ["*.tests", "*.distutils"]
Catatan
Untuk persyaratan nuitka
di atas jalur absolut seperti C:Users...Nuitka
juga akan berfungsi di Linux, gunakan jalur absolut dengan dua garis miring di depan, misalnya //home/.../Nuitka
.
Catatan
Apapun pendekatan yang Anda ambil, file data di roda ini tidak ditangani oleh Nuitka sama sekali, tetapi oleh setuptools. Namun, Anda dapat menggunakan penyematan file data komersial Nuitka. Dalam hal ini, Anda sebenarnya akan menyematkan file di dalam modul ekstensi itu sendiri, dan bukan sebagai file di roda.
Jika Anda memiliki banyak program, masing-masing program harus dapat dieksekusi, sebelumnya Anda harus mengkompilasi beberapa kali, dan menerapkan semuanya. Dengan mode mandiri, ini tentu saja berarti Anda cukup boros karena berbagi folder dapat dilakukan, tetapi tidak terlalu didukung oleh Nuitka.
Masuk ke Multidist
. Ada opsi --main
yang menggantikan atau menambah argumen posisi yang diberikan. Dan itu bisa diberikan berkali-kali. Ketika diberikan berkali-kali, Nuitka akan membuat biner yang berisi kode semua program yang diberikan, namun berbagi modul yang digunakan di dalamnya. Oleh karena itu, mereka tidak perlu didistribusikan berkali-kali.
Sebut saja nama dasar jalur utama, dan titik masuk. Tentu saja nama-namanya harus berbeda. Kemudian biner yang dibuat dapat mengeksekusi salah satu titik masuk, dan akan bereaksi terhadap apa yang muncul sys.argv[0]
padanya. Jadi jika dijalankan dengan cara yang benar (dengan sesuatu seperti subprocess
atau OS API Anda dapat mengontrol nama ini), atau dengan mengganti nama atau menyalin biner, atau menghubungkannya ke biner, Anda kemudian dapat mencapai keajaiban.
Hal ini memungkinkan untuk menggabungkan program yang sangat berbeda menjadi satu.
Catatan
Fitur ini masih bersifat eksperimental. Gunakan dengan hati-hati dan laporkan temuan Anda jika Anda menemukan perilaku yang tidak diinginkan
Mode ini bekerja dengan standalone, onefile, dan akselerasi belaka. Ini tidak berfungsi dengan mode modul.
Untuk integrasi dengan alur kerja GitHub, ada Nuitka-Action yang harus Anda gunakan yang membuatnya sangat mudah untuk diintegrasikan. Anda harus memulai dengan kompilasi lokal, tetapi ini akan lebih mudah untuk kompilasi lintas platform dengan Nuitka.
Ini adalah contoh alur kerja yang dibangun pada ketiga OS
pekerjaan:membangun: strategi: matriks: os: [macos-terbaru, ubuntu-terbaru, windows-terbaru] berjalan: ${{ matriks.os }} tangga: - nama: Repositori check-out menggunakan: action/checkout@v4 - nama: Setup Penggunaan Python: action/setup-python@v5 dengan: python-version: '3.10' cache: 'pip' cache-dependency-path: | **/requirements*.txt - nama: Instal Dependensi Anda, jalankan: | pip install -r persyaratan.txt -r persyaratan-dev.txt - nama: Build Executable dengan Nuitka menggunakan: Nuitka/Nuitka-Action@main dengan: nuitka-version: main script-name: your_main_program.py # masih banyak lagi opsi Nuitka yang tersedia , lihat dokumen tindakan, namun yang terbaik # adalah menggunakan opsi nuitka-project: dalam kode Anda, jadi misalnya, Anda dapat membuat # perbedaan untuk macOS dan membuat bundel aplikasi di sana. onefile: true - nama: Unggah Artefak menggunakan: action/upload-artifact@v3 dengan: nama: ${{ runner.os }} Jalur pembuatan: | # cocok dengan apa yang dibuat untuk 3 OS build/*.exe build/*.bin build/*.app/**/*
Jika aplikasi Anda adalah GUI, misalnya your_main_program.py
harus berisi komentar-komentar ini seperti yang dijelaskan dalam Opsi Nuitka dalam kode karena pada macOS ini harus berupa bundel.
# Mode kompilasi, mandiri di mana saja, kecuali di macOS ada app bundle# nuitka-project-if: {OS} di ("Windows", "Linux", "FreeBSD"):# nuitka-project: --onefile# nuitka-project -if: {OS} == "Darwin":# nuitka-project: --standalone# nuitka-project: --macos-create-app-bundle#
Untuk tampilan yang bagus, Anda dapat menentukan ikon. Di Windows, Anda dapat menyediakan file ikon, template yang dapat dieksekusi, atau file PNG. Semua ini akan berhasil dan bahkan dapat digabungkan:
# Ini membuat binari dengan ikon di Windowspython -m nuitka --onefile --windows-icon-from-ico=your-icon.png program.py python -m nuitka --onefile --windows-icon-from-ico=ikon-Anda.ico program.py python -m nuitka --onefile --windows-icon-template-exe=your-icon.ico program.py# Ini membuat bundel aplikasi dengan ikon di macOSpython -m nuitka --macos-create-app-bundle --macos- app-icon=ikon-Anda.png program.py python -m nuitka --macos-create-app-bundle --macos-app-icon=ikon-Anda.icns program.py
Catatan
Dengan Nuitka, Anda tidak perlu membuat ikon khusus platform, tetapi Nuitka akan mengkonversi misalnya PNG, tetapi juga format lain dengan cepat selama pembuatan.
Hak untuk bundel aplikasi macOS dapat ditambahkan dengan opsi, --macos-app-protected-resource
, semua nilai tercantum di halaman ini dari Apple
Contoh nilainya adalah --macos-app-protected-resource=NSMicrophoneUsageDescription:Microphone access
untuk meminta akses ke Mikrofon. Setelah titik dua, teks deskriptif diberikan.
Catatan
Berhati-hatilah karena jika ada kemungkinan penggunaan spasi di bagian deskripsi, Anda perlu mengutipnya agar shell Anda dapat lolos ke Nuitka dan tidak ditafsirkan sebagai argumen Nuitka.
Di Windows, konsol tidak dibuka oleh program kecuali Anda mengatakannya. Nuitka secara default tidak menampilkannya, Anda dapat memaksanya dengan menggunakan --console=force
, kemudian program akan membuka Jendela terminal baru ketika dijalankan.
Layar splash berguna ketika startup program lambat. Startup Onefile sendiri tidak lambat, tetapi program Anda mungkin lambat, dan Anda tidak dapat mengetahui seberapa cepat komputer yang digunakan, jadi mungkin ada baiknya untuk memilikinya. Untungnya, dengan Nuitka, mereka mudah ditambahkan untuk Windows.
Untuk splash screen, Anda perlu menentukannya sebagai file PNG, lalu pastikan untuk menonaktifkan splash screen ketika program Anda sudah siap, misalnya telah menyelesaikan impor, menyiapkan jendela, terhubung ke database, dan menginginkan splash screen untuk pergi. Di sini kita menggunakan sintaks proyek untuk menggabungkan kode dengan pembuatan, kompilasi ini:
# nuitka-project: --onefile# nuitka-project: --onefile-windows-splash-screen-image={MAIN_DIRECTORY}/Splash-Screen.png# Apa pun ini, jelasprint("Menunda startup 10 detik..." )impor waktu, tempfile, ostime.sleep(10)# Gunakan kode ini untuk menandakan penghapusan layar splash.if "NUITKA_ONEFILE_PARENT" di os.environ: splash_filename = os.path.join( tempfile.gettempdir(), "onefile_%d_splash_feedback.tmp" % int(os.environ["NUITKA_ONEFILE_PARENT"]), ) if os.path.exists(splash_filename): os.unlink(splash_filename)print("Selesai... splash seharusnya hilang.") ...# Program lainnya ada di sini.
Untuk analisis program Anda dan kemasan Nuitka, tersedia Laporan Kompilasi. Anda juga dapat membuat laporan khusus dengan menyediakan templat Anda, yang beberapa di antaranya sudah ada di dalam Nuitka. Laporan-laporan ini berisi semua informasi detail, misalnya ketika sebuah modul dicoba untuk diimpor, namun tidak ditemukan, Anda dapat melihat di mana hal tersebut terjadi. Untuk pelaporan bug, sangat disarankan untuk memberikan laporannya.
Anda dapat melampirkan informasi hak cipta dan merek dagang, nama perusahaan, nama produk, dan sebagainya ke dalam kompilasi Anda. Ini kemudian digunakan dalam informasi versi untuk biner yang dibuat di Windows, atau bundel aplikasi di macOS. Jika Anda menemukan sesuatu yang kurang, harap beri tahu kami.
Secara default, Nuitka mengkompilasi tanpa --deployment
yang membiarkan satu set penjaga dan pembantu aman tetap aktif, yang bertujuan untuk men-debug penggunaan Nuitka yang salah.
Ini adalah fitur baru, dan menerapkan banyak perlindungan dan bantuan, yang didokumentasikan di sini.
Jadi setelah kompilasi, sys.executable
adalah biner yang dikompilasi. Dalam hal paket seperti multiprocessing
, joblib
, atau loky
apa yang biasanya dilakukan ini adalah untuk berjalan dari python
penuh dengan sys.executable
dan kemudian dapat menggunakan opsinya seperti -c command
atau -m module_name
dan kemudian dapat Luncurkan kode lain untuk sementara atau permanen sebagai daemon layanan.
Namun dengan Nuitka, ini menjalankan program Anda lagi, dan menempatkan argumen ini, di sys.argv
di mana Anda mungkin mengabaikannya, dan kemudian Anda membayar diri Anda lagi untuk meluncurkan helper Daemon. Kadang -kadang ini akhirnya melahirkan proses penghitungan CPU yang menelurkan proses penghitungan CPU yang ... ini disebut bom garpu, dan dengan hampir semua sistem, yang membekukannya dengan mudah sampai mati.
Itu sebabnya misalnya ini terjadi dengan nuitka default:
./hello.dist/hello.bin -l bodoh -m foom -n foon -o fooo -p Kesalahan, program mencoba menyebut dirinya dengan argumen '-m'. Nonaktifkan dengan '---no-deployment-flag = Ekseksi-diri'.
Program Anda mungkin memiliki parsing baris perintah sendiri, dan tidak menggunakan paket yang tidak didukung yang berusaha untuk mengeksekusi ulang. Dalam hal ini, Anda perlu waktu kompilasi untuk menggunakan --no-deployment-flag=self-execution
yang menonaktifkan penjaga khusus ini.
Beberapa paket menghasilkan apa yang menurut mereka adalah informasi yang bermanfaat tentang apa arti alasan impor yang gagal. Dengan program yang dikompilasi, sering kali ada salah. Kami mencoba dan memperbaikinya dalam mode non-penempatan. Berikut adalah contoh, di mana kami mengubah pesan yang meminta untuk menginstal PIP (yang bukan masalah) untuk mengarahkan pengguna ke perintah include yang membuat plugin imageio
berfungsi.
- Modul-nama: 'Imageo.core.imopen' Anti-bloat: -replacements_plain: '`pip install imageIo [{config.install_name}]` untuk menginstalnya': '`--include-module = {config.module_name}` dengan nuitka untuk memasukkannya''err_type = importerror': 'err_type = RuntimeError 'Kapan:' bukan penempatan '
Mode penyebaran relatif baru dan terus -menerus lebih banyak fitur ditambahkan, misalnya sesuatu untuk FileNotFoundError
harus segera hadir.
Semua pembantu ini tentu saja dapat dinonaktifkan sekaligus dengan --deployment
tetapi perlu diingat bahwa untuk debugging, Anda mungkin ingin mengaktifkannya kembali. Anda mungkin ingin menggunakan opsi proyek Nuitka dan variabel lingkungan untuk membuat kondisi ini.
Haruskah Anda menonaktifkan semuanya?
Kami percaya, menonaktifkan hanya terjadi secara selektif, tetapi dengan peningkatan PYPI, perubahan kode Anda, semua masalah ini dapat menyelinap kembali. Penghematan ruang mode penyebaran saat ini dapat diabaikan, jadi usaha untuk tidak melakukannya, tetapi tinjau apa yang ada, dan Jika Anda tahu itu tidak dapat memengaruhi Anda, atau jika itu terjadi, Anda tidak akan membutuhkannya. Beberapa yang akan datang, jelas akan diarahkan pada penggunaan tingkat pemula.
Binari yang dikompilasi pada Windows dengan pengaturan default Nuitka dan tidak ada tindakan lebih lanjut yang dapat diakui oleh beberapa vendor AV sebagai malware. Ini dapat dihindari, tetapi hanya dalam komersial Nuitka ada dukungan dan instruksi yang sebenarnya untuk bagaimana melakukannya, melihat ini sebagai komersial yang hanya dibutuhkan. https://nuitka.net/doc/commercial.html
Untuk Linux Standalone, cukup sulit untuk membangun biner yang bekerja pada versi Linux lainnya. Ini terutama karena di Linux, banyak perangkat lunak dibangun secara khusus ditargetkan untuk DLL beton. Hal -hal seperti GLIBC digunakan, kemudian dikodekan ke dalam biner yang dibangun, dan itu tidak akan berjalan dengan GLIBC yang lebih tua, hanya untuk memberikan satu contoh kritis.
Solusinya adalah membangun OS tertua yang ingin Anda lihat didukung. Memilih itu dan mengaturnya bisa membosankan, jadi bisa login, dan menyimpannya