zipapp - đóng gói app Python vào 1 file zip chạy được

img

Code Python có thể được đóng trong 1 file zip và chạy được (như file .exe trên Windows). Ví dụ đơn giản trên Ubuntu:

$ mkdir ziptest
$ echo 'print("Hello Pymier")' > ziptest/__main__.py
$ python3 -m zipapp ziptest
$ ls -l ziptest.pyz
-rw-rw-r-- 1 hvn hvn 142 Sep 28 21:24 ziptest.pyz
$ file ziptest.pyz
ziptest.pyz: Zip archive data, at least v2.0 to extract
$ zipinfo ziptest.pyz
Archive:  ziptest.pyz
Zip file size: 142 bytes, number of entries: 1
-rw-rw-r--  2.0 unx       22 b- stor 22-Sep-28 21:20 __main__.py
1 file, 22 bytes uncompressed, 22 bytes compressed:  0.0%
$ python ziptest.pyz
Hello Pymier

Code trong file __main__.py sẽ được chạy.

Chỉ là 1 file zip

Việc tạo file zip này không cần bất cứ tool gì đặt biệt, chỉ cần tạo 1 file zip chứa file __main__.py (và N file khác nếu cần) là được.

Tài liệu của Python lib zipapp có giải thích format này, chú ý rằng file zip có header ở chỗ nào cũng được (chứ không bắt buộc phải ở đầu file):

The zip file format allows arbitrary data to be prepended to a zip file. The zip application format uses this ability to prepend a standard POSIX “shebang” line to the file (#!/path/to/interpreter). Formally, the Python zip application format is therefore:

An optional shebang line, containing the characters b'#!' followed by an interpreter name, and then a newline (b'\n') character. The interpreter name can be anything acceptable to the OS shebang processing, or the Python launcher on Windows. The interpreter should be encoded in UTF-8 on Windows, and in sys.getfilesystemencoding() on POSIX.

Standard zipfile data, as generated by the zipfile module. The zipfile content must include a file called __main__.py (which must be in the root of the zipfile - i.e., it cannot be in a subdirectory). The zipfile data can be compressed or uncompressed.

If an application archive has a shebang line, it may have the executable bit set on POSIX systems, to allow it to be executed directly.

There is no requirement that the tools in this module are used to create application archives - the module is a convenience, but archives in the above format created by any means are acceptable to Python.

https://docs.python.org/3/library/zipapp.html

Làm một app dùng lib requests, beautifulsoup4

Tạo thư mục myapp, tạo file myapp/__main__.py với nội dung

from bs4 import BeautifulSoup
import requests
resp = requests.get("https://pymi.vn/")
tree = BeautifulSoup(resp.text, features="lxml")
i_tags = [
    node.text
    for node in tree.find("div", attrs={"role": "alert"}).find_all(
        "li"
    )
]
for msg in i_tags:
    print(msg)

Chạy lệnh để cài các thư viện và đóng gói zipapp:

$ python3 -m pip install requests bs4 --target myapp
...
$ ls myapp/
beautifulsoup4-4.11.1.dist-info     idna
bin                                 idna-3.4.dist-info
bs4                                 requests
bs4-0.0.1.egg-info                  requests-2.28.1.dist-info
certifi                             soupsieve
certifi-2022.9.24.dist-info         soupsieve-2.3.2.post1.dist-info
charset_normalizer                  urllib3
charset_normalizer-2.1.1.dist-info  urllib3-1.26.12.dist-info
$ python3 -m zipapp -p "/usr/bin/env python3" myapp
$ ./myapp.pyz
TPHCM 😱 Dự kiến khai giảng học livestream với lớp  Nội giữa tháng 10 2022 🎉.
 Nội 😱 Dự kiến khai giảng giữa tháng 10 2022 🎉.

Hết.

Đăng ký ngay tại PyMI.vn để học Python tại Hà Nội TP HCM (Sài Gòn), trở thành lập trình viên #python chuyên nghiệp ngay sau khóa học.