>  기사  >  백엔드 개발  >  Nuitka 소개: Python을 컴파일하고 배포하는 더 나은 방법

Nuitka 소개: Python을 컴파일하고 배포하는 더 나은 방법

WBOY
WBOY앞으로
2023-04-13 12:55:062214검색

번역가 | Li Rui

리뷰어 | Sun Shujuan

Python이 점점 대중화되면서 그 한계도 점점 더 분명해지고 있습니다. 한편으로는 Python 애플리케이션을 작성하고 Python이 설치되지 않은 사람들에게 배포하는 것이 매우 어려울 수 있습니다.

이 문제를 해결하는 가장 일반적인 방법은 프로그램을 모든 지원 라이브러리와 파일, Python 런타임과 함께 패키지하는 것입니다. PyInstaller와 같이 이를 수행할 수 있는 도구가 있지만 제대로 작동하려면 많은 캐싱이 필요합니다. 게다가 생성된 패키지에서 Python 프로그램의 소스 코드를 추출하는 것이 가능한 경우도 많습니다. 어떤 경우에는 이것이 거래 중단이 될 수 있습니다.

서드파티 프로젝트 Nuitka는 획기적인 솔루션을 제공합니다. CPython 런타임을 프로그램 바이트코드로 패키징하는 것이 아니라 Python 명령을 C로 변환하여 Python 프로그램을 C 바이너리로 컴파일합니다. 결과는 압축된 패키지로 배포되거나 다른 타사 제품과 함께 설치 프로그램으로 패키지될 수 있습니다.

Nuitka는 또한 Python 생태계와의 호환성을 최대한 유지하려고 노력하므로 NumPy와 같은 타사 라이브러리가 안정적으로 작동할 수 있습니다. 또한 Nuitka는 가능한 경우 컴파일된 Python 프로그램의 성능을 향상시키지만 전반적인 호환성을 저하시키지 않습니다. 속도 향상은 보장되지 않으므로 작업 부하에 따라 크게 다르며 일부 프로그램에서는 성능이 크게 향상되지 않을 수 있습니다. 일반적으로 성능을 위해 Nuitka에 의존하지 않고 번들 솔루션으로 사용하는 것이 가장 좋습니다.

Nuitka 설치

Nuitka는 Python 2.6~2.7 및 Python 3.3~3.10에서 사용할 수 있습니다. Microsoft Windows, macOS, Linux 및 FreeBSD/NetBSD용 바이너리를 컴파일할 수 있습니다. 개발자는 대상 플랫폼에서 바이너리를 빌드해야 하며 크로스 컴파일은 불가능하다는 점을 기억하는 것이 중요합니다.

각 플랫폼마다 Python 런타임 외에도 C 컴파일러도 필요합니다. Microsoft Windows에서는 Visual Studio 2022 이상이 권장되지만 MinGW-w64 C11(gcc 11.2 이상)도 사용할 수 있습니다. 다른 플랫폼의 경우 Visual Studio에서 Windows의 gcc 5.1 이상, g++4.4 이상, clang 또는 clang cl을 사용할 수 있습니다.

Python 3.3 또는 Python 3.4를 사용하는 경우 도구 종속성으로 인해 Python 2.7이 필요하다는 점에 유의하는 것이 중요합니다. 이 모든 것은 가능하다면 최신 버전의 Python을 사용해야 하는 이유가 됩니다.

Nuitka를 배포 종속성보다는 개발 종속성으로 프로젝트와 함께 가상 환경에 설치하는 것이 가장 좋습니다. Nuitka 자체는 번들링을 수행하거나 프로젝트에 의해 사용되지 않습니다.

Nuitka 처음 사용하기

Nuitka를 설치한 후 Nuitka 또는 python-m nuitka를 사용하여 호출합니다.

개발자가 Nuitka로 가장 먼저 하고 싶은 일은 C 컴파일러를 포함한 전체 툴체인이 제대로 작동하는지 확인하는 것입니다. 이를 테스트하려면 간단한 "Hello world" Python 프로그램을 컴파일하고 이름을 main.py로 지정할 수 있습니다.

print ("Hello world")

Nuitka로 Python 프로그램을 컴파일할 때 진입점 모듈의 이름을 Nuitka에 인수로 전달하세요. 예: Nuitka main.py. 이렇게 호출되면 Nuitka는 main.py를 수신하고 여기에서 실행 파일을 빌드합니다.

Nuitka의 기능만 테스트하기 때문에 Python 파일을 실행 파일로 컴파일만 한다는 점에 유의해야 합니다. 다른 어떤 것도 컴파일하지 않으며 재배포를 위해 어떤 것도 번들로 제공하지 않습니다. 그러나 파일을 컴파일하는 것만으로도 Nuitka의 툴체인이 올바르게 설정되었는지 확인하기에 충분합니다.

컴파일이 완료되면 Python 프로그램과 동일한 디렉터리에 바이너리 실행 파일이 표시됩니다. 실행 파일을 실행하여 제대로 작동하는지 확인하세요.

--run을 명령줄 플래그로 전달하여 Nuitka 컴파일 애플리케이션을 자동으로 실행할 수도 있습니다.

"Hello world" 테스트 실행 파일이 작동하면 재배포 가능 파일로 패키지해 볼 수 있습니다. 이 과정은 아래에 설명되어 있습니다.

Nuitka를 사용하여 첫 번째 테스트 컴파일을 실행할 때 몇 초 내에 완료될 수 있다는 점에 유의하는 것이 중요합니다. 그리고 이는 전체 프로그램이 아닌 하나의 모듈만 컴파일합니다. Nuitka로 전체 프로그램을 컴파일하는 데는 프로그램에서 사용하는 모듈 수에 따라 몇 분 이상 걸릴 수 있습니다.

Nuitka를 사용하여 Python 프로그램 컴파일

기본적으로 Nuitka는 지정된 모듈만 컴파일합니다. 모듈에 프로그램의 다른 곳, 표준 라이브러리 또는 타사 패키지에서 가져온 항목이 있는 경우 이러한 가져오기도 컴파일해야 함을 지정해야 합니다.

인접 모듈인 Greeting.py(

def greet(name):
print ("Hello ", name)

)와 수정된 main.py(

import greet
greet.greet("world")

)가 있는 수정된 "Hello world" 프로그램을 고려해 보세요. 이 두 모듈을 컴파일하려면 --follow-를 사용할 수 있습니다. imports 스위치:

nuitka --follow-imports main.py

이 스위치는 전체 프로그램에 필요한 모든 가져오기가 import 문에서 이어져 함께 컴파일되도록 합니다.

또 다른 옵션 --nofollow-import-to를 사용하면 가져오기 프로세스에서 특정 하위 디렉터리를 제외할 수 있습니다. 이 옵션은 한 번도 사용된 적이 없는 테스트 모음이나 모듈을 필터링하는 데 유용합니다. 또한 와일드카드를 매개변수로 제공할 수도 있습니다.

Nuitka 소개: 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

위 내용은 Nuitka 소개: Python을 컴파일하고 배포하는 더 나은 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제