Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengenalan kepada Nuitka: Cara yang lebih baik untuk menyusun dan mengedarkan Python

Pengenalan kepada Nuitka: Cara yang lebih baik untuk menyusun dan mengedarkan Python

WBOY
WBOYke hadapan
2023-04-13 12:55:062135semak imbas

Penterjemah |. Li Rui

Pengulas |. Di satu pihak, menulis aplikasi Python dan mengedarkannya kepada orang yang tidak memasang Python boleh menjadi sangat sukar.

Cara paling biasa untuk menyelesaikan masalah ini ialah membungkus atur cara dengan semua perpustakaan dan fail sokongannya serta masa jalan Python. Terdapat alat yang boleh melakukan ini, seperti PyInstaller, tetapi mereka memerlukan banyak caching untuk berfungsi dengan betul. Lebih-lebih lagi, selalunya mungkin untuk mengekstrak kod sumber program Python daripada pakej yang dihasilkan. Dalam sesetengah kes, ini boleh menjadi pemecah perjanjian.

Projek pihak ketiga Nuitka menawarkan penyelesaian radikal. Ia menyusun atur cara Python ke dalam binari C - bukan dengan membungkus masa jalan CPython dengan kod byte program, tetapi dengan menterjemah arahan Python ke dalam C. Hasilnya boleh diedarkan dalam pakej termampat atau dibungkus ke dalam pemasang dengan produk pihak ketiga yang lain.

Nuitka juga cuba mengekalkan keserasian maksimum dengan ekosistem Python, jadi perpustakaan pihak ketiga seperti NumPy boleh berfungsi dengan pasti. Nuitka juga membuat peningkatan prestasi untuk menyusun atur cara Python di mana mungkin, tetapi sekali lagi tanpa mengorbankan keserasian keseluruhan. Kelajuan tidak dijamin, jadi ia berbeza secara meluas antara beban kerja dan sesetengah program mungkin tidak mengalami peningkatan prestasi yang ketara. Secara umum, sebaiknya jangan bergantung pada Nuitka untuk prestasi, tetapi sebagai penyelesaian yang digabungkan.

Pasang Nuitka

Nuitka boleh digunakan dengan Python 2.6 hingga 2.7 dan Python 3.3 hingga 3.10. Ia boleh menyusun binari untuk Microsoft Windows, macOS, Linux dan FreeBSD/NetBSD. Adalah penting untuk ambil perhatian bahawa pembangun mesti membina binari pada platform sasaran adalah tidak mungkin.

Untuk setiap platform, sebagai tambahan kepada masa jalan Python, pengkompil C diperlukan. Pada Microsoft Windows, Visual Studio 2022 atau lebih tinggi disyorkan, tetapi MinGW-w64 C11 (gcc 11.2 atau lebih tinggi) juga boleh digunakan. Untuk platform lain, anda boleh menggunakan gcc 5.1 atau lebih tinggi, g++4.4 atau lebih tinggi, clang atau clang cl pada Windows di bawah Visual Studio.

Adalah penting untuk ambil perhatian bahawa jika menggunakan Python 3.3 atau Python 3.4, Python 2.7 akan diperlukan kerana kebergantungan alat. Semua ini sepatutnya menjadi sebab untuk menggunakan versi terkini Python jika anda boleh.

Adalah yang terbaik untuk memasang Nuitka dalam persekitaran maya bersama-sama dengan projek anda sebagai kebergantungan pembangunan dan bukannya kebergantungan pengedaran. Nuitka sendiri tidak digabungkan dengan atau digunakan oleh projek;

Menggunakan Nuitka buat kali pertama

Selepas memasang Nuitka, gunakan Nuitka atau python-m nuitka untuk memanggilnya.

Perkara pertama yang ingin dilakukan oleh pembangun dengan Nuitka adalah untuk mengesahkan bahawa keseluruhan rantai alat berfungsi dengan baik, termasuk pengkompil C. Untuk menguji ini, anda boleh menyusun atur cara Python "Hello world" mudah, namakannya main.py:

print ("Hello world")
Apabila menyusun atur cara Python menggunakan Nuitka, entri The name of modul titik diserahkan kepada Nuitka sebagai hujah, contohnya Nuitka main.py. Apabila dipanggil seperti ini, Nuitka akan menerima main.py dan membina boleh laku daripadanya.

Perlu diambil perhatian bahawa kerana kami hanya menguji kefungsian Nuitka, ia hanya akan menyusun fail Python ke dalam fail boleh laku. Ia tidak menyusun apa-apa lagi, dan tidak juga menggabungkan apa-apa untuk pengagihan semula. Tetapi menyusun fail sepatutnya cukup untuk menentukan sama ada rantai alat Nuitka disediakan dengan betul.

Selepas penyusunan selesai, anda akan melihat fail boleh laku binari yang terletak dalam direktori yang sama dengan program Python. Jalankan boleh laku untuk memastikan ia berfungsi dengan betul.

Ia juga mungkin untuk menjalankan aplikasi yang disusun Nuitka secara automatik dengan menghantar --run sebagai bendera baris arahan.

Jika ujian boleh laku "Hello world" berfungsi, anda boleh cuba membungkusnya sebagai fail boleh diedarkan semula. Proses ini dijelaskan di bawah.

Adalah penting untuk ambil perhatian bahawa apabila menjalankan kompilasi ujian pertama menggunakan Nuitka, ia mungkin mengambil masa beberapa saat untuk diselesaikan. Dan ini hanya menyusun satu modul, bukan keseluruhan program. Menyusun program lengkap dengan Nuitka boleh mengambil masa beberapa minit atau lebih lama, bergantung pada bilangan modul yang digunakan oleh program tersebut.

Gunakan Nuitka untuk menyusun atur cara Python

Secara lalai, Nuitka hanya menyusun modul tertentu. Jika modul mempunyai import dari tempat lain dalam program, daripada pustaka standard, atau daripada pakej pihak ketiga, anda perlu menentukan bahawa import ini juga harus disusun.

Pertimbangkan program "Hello world" yang diubah suai dengan modul bersebelahan dipanggil greet.py:

def greet(name):
print ("Hello ", name)
dan diubah suai utama:

import greet
greet.greet("world")
Untuk menyusun dua modul ini, anda boleh menggunakan suis --follow-imports:

nuitka --follow-imports main.py
Suis ini Memastikan semua import diperlukan oleh keseluruhan program dijejaki daripada penyata import dan disusun bersama.

Pilihan lain --nofollow-import-to membenarkan untuk mengecualikan subdirektori tertentu daripada proses import. Pilihan ini berguna untuk menapis suite ujian atau modul yang anda tahu tidak pernah digunakan. Ia juga membenarkan kad bebas disediakan sebagai parameter.

Pengenalan kepada Nuitka: Cara yang lebih baik untuk menyusun dan mengedarkan Python

图1.使用Nuitka编译大型复杂程序。这个示例涉及编译Pyglet模块以及标准库中的许多模块,这需要几分钟的时间

(1)包括动态导入  

现在出现了Python用户在尝试打包Python应用程序以进行分发时经常遇到的问题之一。--follow-imports选项仅遵循通过import语句在代码中显式声明的导入。它不处理动态导入。  

为了解决这个问题,可以使用--include-plugin-directory开关为动态导入的模块提供一个或多个路径。例如,对于包含动态导入代码的名为mods的目录,可以使用:  

nuitka--follow-imports--include-plugin-directory=modsmain.py

(2)包括数据文件和目录  

如果Python程序使用在运行时加载的数据文件,Nuitka也无法自动检测这些文件。要将单个文件和目录包含在Nuitka打包程序中,可能使用--include-data-files和--include-data-dir。  

--include-data-files允许为要复制的文件指定通配符以及要将它们复制到的位置。例如,--include-data dir=/path/to/data=data会将/path.to/data中的所有内容复制到分发目录中的匹配目录数据。

-include-data-dir的工作方式大致相同,只是它不使用通配符;它只允许传递要复制的路径和要将其复制到的分发文件夹中的目标。例如,--include-data dir=/path/to/data=data会将/path.to/data中的所有内容复制到分发目录中的匹配目录数据。

(3)包括Python包和模块  

指定导入的另一种方法是使用Python样式的包命名空间而不是文件路径,使用--include-package选项。例如,以下命令将包括mypackage,它在磁盘上的任何位置(假设Python可以找到它),以及它下面的所有内容:  

nuitka --include-package=mypackage main.py

如果包需要自己的数据文件,可以使用--include-package-data选项包含这些文件:  

nuitka --include-package=mypackage --include-package-data=mypackage main.py

该命令告诉Nuitka获取包目录中实际上不是代码的所有文件。  

如果只想包含单个模块,可以使用--include-module:  

nuitka --include-module=mypackage.mymodule main.py

该命令告诉Nuitka只包含mypackage.mymodule,而不包含其他内容。  

编译Python程序进行重新分发

当想用Nuitka编译Python程序以进行重新分发时,可以使用命令行开关--standalone来处理大部分工作。此开关自动跟随所有导入并生成一个dist文件夹,其中包含已编译的可执行文件和所需的任何支持文件。要重新分发程序,只需要复制此目录即可。  

不要指望--standalone的程序在第一次运行时就可以工作。Python程序的一般动态性几乎保证了需要使用上述其他一些选项来确保编译的程序正常运行。例如,如果有一个需要特定字体的GUI应用程序,可能必须使用--include-data-files或--include-data-dir将它们复制到发行版中。  

此外,如上所述,--standalone应用程序的编译时间可能比测试编译长得多。一旦对测试独立构建的应用程序需要多长时间有所了解,就为测试独立构建的应用程序所需的构建时间进行预算。

最后,Nuitka提供了另一个构建选项--onefile。对于那些熟悉PyInstaller的人来说,--onefile的工作方式与该程序中的相同选项相同:它将整个应用程序(包括其所有依赖文件)压缩为单个可执行文件,无需重新分发其他文件。但是,重要的是要知道--onefile在Linux和Microsoft Windows上的工作方式不同。在Linux上,它使用存档的内容安装一个虚拟文件系统。在Windows上,它会将文件解压缩到一个临时目录中并从那里运行它们,它必须为程序的每次运行执行这一操作。在Windows上使用--onefile可能会显著降低启动程序所需的时间。

原文标题:Intro to Nuitka: A better way to compile and distribute Python,作者:Serdar Yegulalp

Atas ialah kandungan terperinci Pengenalan kepada Nuitka: Cara yang lebih baik untuk menyusun dan mengedarkan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam