zipapp - đóng gói app Python vào 1 file zip chạy được
by Pymier0
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 Hà Nội giữa tháng 10 2022 🎉.
Hà 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.