Mục lục bài viết
Bạn có ghen tị với việc các nhà phát triển Go xây dựng một tệp thực thi và dễ dàng chuyển nó cho người dùng không?
Có vô số hướng dẫn về cách thiết lập môi trường ảo, quản lý các phần phụ thuộc và xuất bản lên PyPI, điều này rất hữu ích khi bạn đang tạo thư viện Python. Có ít thông tin hơn cho các nhà phát triển xây dựng các ứng dụng Python. Hướng dẫn này dành cho các nhà phát triển muốn phân phối ứng dụng cho người dùng có thể là nhà phát triển Python
Trong hướng dẫn này, bạn sẽ học những điều sau
- Cách PyInstaller có thể đơn giản hóa việc phân phối ứng dụng
- Cách sử dụng PyInstaller trong các dự án của riêng bạn
- Cách gỡ lỗi PyInstaller
- Những điều mà PyInstaller không làm được
PyInstaller cung cấp cho bạn khả năng tạo thư mục hoặc tệp thực thi mà người dùng có thể chạy ngay lập tức mà không cần cài đặt thêm. Để đánh giá đầy đủ sức mạnh của PyInstaller, bạn nên xem lại một số vấn đề về phân phối mà PyInstaller giúp bạn tránh
Distribution problems
Thiết lập một dự án Python có thể gây khó chịu, đặc biệt là đối với những người không phải là nhà phát triển. Thông thường, quá trình thiết lập bắt đầu bằng cách mở một thiết bị đầu cuối, một thiết bị đầu cuối không dành cho một nhóm người dùng tiềm năng lớn. Kỹ thuật "rào đón - roadblock" này khiến người dùng dừng lại ngay cả trước khi hướng dẫn cài đặt đi sâu vào các chi tiết phức tạp của môi trường ảo, phiên bản Python và vô số phụ thuộc khả năng
Hãy nghĩ về những gì bạn thường trải qua khi cài đặt trên một máy tính mới để phát triển Python. Nó có thể diễn ra như thế này
- Tải xuống và cài đặt phiên bản Python cụ thể
- setting pip
- Virtual field setting setting
- Get a copy of your code
- Cài đặt phần phụ thuộc
Hãy dừng lại một chút và xem xét xem bất kỳ bước nào ở trên có nghĩa là không nếu bạn không phải là nhà phát triển, chứ đừng nói là nhà phát triển Python. Chắc chắn là không
Những vấn đề này phát sinh nếu người dùng của bạn đủ may mắn để truy cập vào các phần phụ thuộc của cài đặt. Nhưng một số phụ thuộc vẫn yêu cầu biên dịch C/C++ biên dịch hoặc thậm chí là FORTRAN
Rào cản gia nhập này quá cao nếu mục tiêu của bạn là cung cấp ứng dụng cho càng nhiều người dùng thì càng tốt
Trình cài đặt Py
PyInstaller tóm tắt các chi tiết này từ người dùng bằng cách tìm tất cả các phần phụ thuộc của bạn và nhóm chúng lại với nhau. Người dùng của bạn thậm chí sẽ không biết họ đang chạy một dự án Python vì bản thân Trình thông dịch Python đã được đóng gói vào ứng dụng của bạn. Như vậy, PyInstaller sẽ giúp ta tạm biệt các hướng dẫn cài đặt phức tạp
PyInstaller thực hiện sự tích cực tuyệt vời này bằng cách xem xét nội dung mã Python của bạn, phát hiện các phần phụ thuộc của bạn và sau đó đóng gói chúng thành một định dạng phù hợp với hệ điều hành của bạn
Có rất nhiều chi tiết thú vị về PyInstaller, nhưng bây giờ bạn sẽ tìm hiểu những điều cơ bản về cách hoạt động và cách sử dụng nó. Bạn luôn có thể tham khảo nếu bạn muốn biết thêm chi tiết
Ngoài ra, PyInstaller có thể tạo tệp thực thi cho Windows, Linux hoặc macOS. Điều này có nghĩa là người dùng Windows sẽ nhận được một bản
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
8, người dùng Linux nhận được một tệp thực thi thông thường và người dùng macOS nhận được một gói setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
9. Có một số lưu ý cho điều này. Xem phần để biết thêm thông tinChuẩn bị dự án của bạn
PyInstaller yêu cầu ứng dụng của bạn tuân theo một số cấu trúc tối thiểu, cụ thể là bạn phải có tập lệnh CLI để khởi động ứng dụng của mình. Thông thường, điều này có nghĩa là tạo một tập lệnh nhỏ bên ngoài gói Python của bạn tức là nhập gói của bạn và chạy
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
0Đầu vào lệnh là một Python file. Về mặt kỹ thuật, bạn có thể làm bất cứ điều gì bạn muốn trong tập lệnh đầu vào, nhưng bạn nên tránh sử dụng các đối tương nhập khẩu. Bạn vẫn có thể sử dụng các đối tượng nhập tương ứng trong suốt phần còn lại của ứng dụng nếu đó là kiểu bạn thích
Lưu ý. Đầu vào là mã bắt đầu dự án hoặc ứng dụng của bạn
Bạn có thể thử điều này với dự án của riêng mình hoặc làm theo dự án đọc nguồn dữ liệu Python thực tế. Để biết thêm thông tin chi tiết, bạn vui lòng xem hướng dẫn gói về Xuất bản trên PyPI
Bước đầu tiên để xây dựng một phiên bản thực thi của dự án này là thêm điểm tập tin vào. May thay, dự án đọc nguồn dữ liệu có cấu trúc tốt, vì vậy tất cả những gì bạn cần là một gói lệnh rút ngắn bên ngoài gói để chạy nó. Ví dụ. bạn có thể tạo tệp có tên là
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
1 cùng với trình đọc gói bằng mã saufrom reader.__main__ import main
if __name__ == '__main__':
main[]
Lệnh
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
1 này gọi reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
0 để khởi động trình đọc nguồn dữ liệuViệc tạo tập lệnh đầu vào điều này rất đơn giản khi bạn đang làm việc trong dự án của riêng mình vì bạn đã quen thuộc với mã. Tuy nhiên, việc tìm điểm bắt đầu vào mã của người khác không dễ dàng như vậy. Trong trường hợp này, bạn có thể bắt đầu bằng cách xem tệp
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
4 trong dự án của bên thứ baTìm tham chiếu đến đối số
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
5 trong dự án reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
4. Ví dụ. đây là tệp reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
4 của người đọc dự ánsetup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
Nếu bạn có thể thấy, lệnh
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
1 đầu vào file sẽ gọi cùng một hàm được đề cập trong các đối số reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
5Sau khi thay đổi điều này, thư mục dự án của người đọc sẽ giống như thế này, giả sử bạn đã kiểm tra nó vào một thư mục có tên
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
40reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
Lưu ý rằng không có thay đổi nào đối với mã chương trình đọc chính, chỉ là một tệp mới được gọi là
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
1. Lệnh đầu vào này thường là tất cả những gì cần thiết để sử dụng dự án của bạn với PyInstallerTuy nhiên, bạn cũng sẽ muốn tìm cách sử dụng
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
42 hoặc nhập bên trong các hàm. Chúng được gọi là trong thuật ngữ PyInstallerBạn có thể chỉ định thủ công các ẩn nhập để buộc PyInstaller tích hợp các phụ thuộc vào đó nếu việc thay đổi nhập trong ứng dụng của bạn quá khó. Bạn sẽ thấy cách thực hiện công việc này sau khi được hướng dẫn
Khi bạn có thể khởi động ứng dụng của mình bằng tập lệnh Python bên ngoài gói của mình, thì bạn đã sẵn sàng để PyInstaller thử tạo tệp thực thi
Sử dụng PyInstaller
Bước đầu tiên là cài đặt PyInstaller từ PyPI. Bạn có thể thực hiện điều này bằng cách sử dụng pip giống như các gói Python khác
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
4setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
43 sẽ cài đặt PyInstaller phụ thuộc cùng với một lệnh mới. setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
44. PyInstaller có thể được nhập giống như mã Python của bạn và được sử dụng như một thư viện, nhưng bạn chỉ có thể sử dụng nó như một công cụ CLIBạn sẽ sử dụng giao diện thư viện nếu bạn
Bạn sẽ tăng khả năng mặc định của PyInstaller tạo tệp thực thi nếu bạn chỉ có các thuộc tính Python thuần túy. Tuy nhiên, đừng quá căng thẳng nếu bạn có nhiều phụ thuộc phức tạp hơn với phần mở rộng C / C ++
PyInstaller hỗ trợ rất nhiều gói phổ biến như NumPy, PyQt và Matplotlib mà bạn không cần thực hiện thêm bất kỳ công việc nào. Bạn có thể xem thêm về danh sách các gói mà công thức chính PyInstaller hỗ trợ bằng cách tham khảo tài liệu PyInstaller
Đừng lo lắng nếu một số phụ thuộc của bạn không được liệt kê trong tài liệu chính thức. Nhiều gói Python hoạt động tốt. Trên thực tế, PyInstaller đủ phổ biến để nhiều dự án có thể giải thích về cách làm cho mọi thứ hoạt động với PyInstaller
Nói lại, cơ hội để dự án của bạn hoạt động có hiệu quả rất cao
Để thử tạo một tệp thực thi với tất cả các giá trị mặc định, bạn chỉ cần cung cấp cho PyInstaller tên của tệp lệnh đầu vào chính của bạn
Đầu tiên,
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
45 trong thư mục do bạn đầu vào và chuyển nó làm đối số cho lệnh setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
44 đã được thêm vào setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
47 khi PyInstaller được cài đặtVí dụ. thực hiện lệnh sau khi bạn
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
45 vào thư mục setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
40 cấp cao nhất nếu bạn đang theo dõi cùng với nguồn dự án đọc nguồn dữ liệureader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
6Đừng lo lắng nếu bạn thấy nhiều đầu ra trong khi xây dựng tệp thực thi của mình. PyInstaller là độ dài theo mặc định và độ dài có thể được tạo ra để khắc phục lỗi mà bạn sẽ thấy sau
Sâu hơn PyInstaller
PyInstaller rất phức tạp và sẽ tạo ra rất nhiều đầu ra. Vì vậy, điều quan trọng trước tiên là phải biết những gì cần tập trung vào. Cụ thể, tệp thực thi mà bạn có thể phân phối cho người dùng của mình và thông tin giảm khả năng lỗi. Theo mặc định, lệnh
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
44 sẽ tạo ra một số điều cần quan tâm như sau- Một tập tin
61reader/ | ├── reader/ | ├── __init__.py | ├── __main__.py | ├── config.cfg | ├── feed.py | └── viewer.py | ├── cli.py ├── LICENSE ├── MANIFEST.in ├── README.md ├── setup.py └── tests
- Một thư mục
62reader/ | ├── reader/ | ├── __init__.py | ├── __main__.py | ├── config.cfg | ├── feed.py | └── viewer.py | ├── cli.py ├── LICENSE ├── MANIFEST.in ├── README.md ├── setup.py └── tests
- Một thư mục
63reader/ | ├── reader/ | ├── __init__.py | ├── __main__.py | ├── config.cfg | ├── feed.py | └── viewer.py | ├── cli.py ├── LICENSE ├── MANIFEST.in ├── README.md ├── setup.py └── tests
Thông số tệp
File spec will be set name by your CLI file command by your default. Theo dõi ví dụ trên bạn sẽ thấy một tệp có tên
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
64. Bạn sẽ thấy một thông số tệp mặc định như thế nào sau khi chạy PyInstaller trên tệp reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
1reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
3Tệp này sẽ được tạo tự động bằng lệnh
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
44. Phiên bản của bạn sẽ có các đường dẫn khác nhau, nhưng các phần lớn phải giống nhauĐừng lo lắng, bạn không cần phải hiểu đoạn mã trên để sử dụng PyInstaller một cách hiệu quả
Tệp này có thể được sửa đổi và sử dụng lại để tạo tệp thực hiện sau tệp này. Bạn có thể thực hiện các bản dựng trong tương lai nhanh hơn một chút bằng cách cung cấp tệp đặc tả này thay vì tệp lệnh bắt đầu cho lệnh
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
44There are a number. Tuy nhiên, đối với các dự án đơn giản, bạn sẽ không cần phải lo lắng về những chi tiết đó trừ khi bạn muốn tùy chỉnh nhiều cách dự án của mình được xây dựng
Thư mục xây dựng
Thư mục
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
62 là nơi PyInstaller đặt hầu hết các siêu dữ liệu và thông tin dữ liệu nội bộ để xây dựng bản thực thi của bạn. Default content will look same as afterreader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
7Bản dựng thư mục có thể hữu ích để loại bỏ lỗi, nhưng trừ khi bạn gặp sự cố, phần thư mục này có thể bị loại bỏ. Bạn sẽ tìm hiểu thêm về cách khắc phục lỗi sau trong hướng dẫn này
Thư mục dist
Sau khi xây dựng, bạn sẽ kết thúc với một thư mục
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
63 tương tự như saureader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
9Thư
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
63 chứa các thành phần cuối cùng bạn sẽ muốn gửi đến người dùng của bạn. Bên trong thư mục reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
63, có một thư mục được đặt tên theo đầu của bạn. Vì vậy, trong ví dụ này, bạn sẽ có một thư mục reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
32 chứa tất cả các thành viên phụ thuộc và có thể thực hiện việc thi cho ứng dụng của chúng tôi. Tệp thực thi để chạy là reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
33 hoặc reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
34 nếu bạn đang sử dụng WindowsBạn cũng sẽ thấy rất nhiều tệp có phần mở rộng
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
35, reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
36 và __reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
37 tùy thuộc vào hệ điều hành của bạn. Đây là các thư viện được chia sẻ đại diện cho các phần phụ thuộc vào dự án của bạn mà PyInstaller đã tạo và thu thậpLưu ý. You can can add *. spec, build/và dist/ vào tệp. gitignore của bạn để giữ trạng thái git sạch nếu bạn đang sử dụng git để kiểm soát phiên bản. Tệp GitHub gitignore mặc định cho các dự án Python đã thực hiện điều này cho bạn
Bạn sẽ muốn phân phối toàn bộ thư mục
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
32, nhưng bạn có thể đổi tên reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
39 thành tên bất kỳ theo ý bạnTại thời điểm này, bạn có thể thử chạy tệp thực thi
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
33 nếu bạn đang thực hiện tương tự với ví dụ về nguồn đọc nguồn dữ liệuBạn sẽ thấy rằng việc chạy tệp thực thi dẫn đến lỗi đề cập đến tệp
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
71. Điều này là làm cho trình đọc nguồn cấp dữ liệu và các phần phụ thuộc của nó yêu cầu một số tệp dữ liệu bổ sung mà PyInstaller không biết. Để giải quyết vấn đề đó, bạn phải thông báo cho PyInstaller rằng reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
71 là cần thiết, bạn sẽ tìm hiểu về điều này khiMột số tùy chỉnh lệnh
PyInstaller đi kèm với rất nhiều tùy chọn có thể được cung cấp dưới định dạng tệp thông số kỹ thuật hoặc tùy chọn CLI thông thường. Dưới đây, bạn sẽ tìm thấy một số tùy chọn phổ biến và hữu ích nhất
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
73Thay đổi tên tập tin thực thi của bạn
Đây là một cách để tránh tệp thực thi tệp, tệp đặc tả và các thư mục được đặt tên theo lệnh đầu vào tệp của bạn.
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
73 rất hữu ích nếu bạn có thói quen đặt tên tập lệnh đầu vào của mình có dạng giống như reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
1Bạn có thể tạo một tệp thực thi cuộc gọi là
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
76 từ tập lệnh reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
1 bằng một lệnh như saureader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
8reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
78Đóng gói toàn bộ ứng dụng của bạn thành một tệp thực thi duy nhất
Các tùy chọn mặc định tạo ra một thư mục phụ thuộc và và thực thi, trong khi
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
78 phân phối dễ dàng hơn bằng cách tạo ra chỉ một thực thiTùy chọn này không có đối số. Để nhóm dự án của bạn thành một tệp duy nhất, bạn có thể xây dựng bằng một lệnh như sau
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
1Với lệnh trên, thư mục
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
63 của bạn sẽ chỉ chứa một tệp thực thi duy nhất thay vì một thư mục có tất cả các tệp phụ thuộc trong các tệp riêng biệtreader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
91Liệt kê nhiều mục nhập cao cấp nhất mà PyInstaller không thể tự động phát hiện
Đây là một cách để làm xung quanh mã của bạn bằng cách sử dụng
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
92 bên trong các hàm và setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
42. Bạn cũng có thể sử dụng reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
91 nhiều lần trong cùng một lệnhTùy chọn này yêu cầu tên của gói mà bạn muốn đưa vào tệp thực thi của mình. Ví dụ. Nếu dự án của bạn đã nhập thư viện yêu cầu bên trong một hàm, thì PyInstaller sẽ không tự động đưa
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
95 vào tệp thực thi của bạn. You could use the command after to force_______395 được đưa vàosetup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
0Bạn có thể chỉ định điều này nhiều lần trong lệnh xây dựng của mình, một lần cho mỗi lần nhập ẩn
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
97 và reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
98Hướng dẫn PyInstaller chèn thêm dữ liệu hoặc tệp nhị phân vào bản dựng của bạn
Điều này hữu ích khi bạn muốn nhóm trong các tệp cấu hình, ví dụ hoặc dữ liệu không phải mã khác. Bạn sẽ thấy một ví dụ về điều này sau nếu bạn đang theo dõi cùng dự án đọc nguồn dữ liệu
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
99Loại trừ một số mô-đun được tích hợp trong tệp thực thi của bạn
Điều này rất hữu ích để loại trừ các yêu cầu chỉ dành cho nhà phát triển như thử nghiệm khung chẳng hạn. Đây là một cách tuyệt vời để duy trì kết quả mà trong đó bạn cung cấp cho người dùng càng nhỏ càng tốt. Ví dụ. nếu bạn sử dụng pytest, bạn có thể muốn loại trừ điều này khỏi tệp thực thi của mình
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
1reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
80Winding auto open control panel to
81 nhật kýreader/ | ├── reader/ | ├── __init__.py | ├── __main__.py | ├── config.cfg | ├── feed.py | └── viewer.py | ├── cli.py ├── LICENSE ├── MANIFEST.in ├── README.md ├── setup.py └── tests
Điều này chỉ hữu ích nếu bạn đang xây dựng một ứng dụng hỗ trợ GUI. Điều này giúp bạn ẩn các thông tin chi tiết về quá trình phát triển của mình bằng cách cho phép người dùng không bao giờ nhìn thấy thiết bị đầu cuối
Tương tự như tùy chọn
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
78, reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
80 không có đối sốsetup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
2Tệp
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
84Như đã đề cập trước đó, bạn có thể sử dụng lại tệp
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
84 được tạo tự động để tùy chỉnh thêm tệp thực thi của mình. Tệp reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
84 là một tệp lệnh [tập lệnh] Python thông thường trong đó mặc định sử dụng thư viện API PyInstallerVì nó là một tập lệnh Python thông thường, nên bạn có thể làm hầu hết mọi thứ bên trong nó. Bạn có thể tham khảo tài liệu công thức chính của PyInstaller Spec để biết thêm thông tin về API này
Kiểm tra khả năng thực hiện cuộc thi mới của bạn
Cách tốt nhất để kiểm tra tệp thực thi mới của bạn là trên một máy mới. Máy mới phải có cùng hệ điều hành với máy bạn đang xây dựng. Lý tưởng nhất là máy này càng giống với những gì người dùng của bạn sử dụng càng tốt. Điều đó có thể không phải lúc nào cũng có thể thực hiện được, vì vậy điều tốt nhất tiếp theo là thử nghiệm trên máy của chính bạn
Điều quan trọng là chạy tệp kết quả thi mà không cần kích hoạt môi trường phát triển của bạn. Điều này có nghĩa là chạy mà không có
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
87, reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
88 hoặc bất kỳ môi trường nào có thể truy cập cài đặt Python của bạn. Hãy nhớ rằng, một trong những mục tiêu chính của tệp thực thi do PyInstaller tạo ra là để người dùng không cần cài đặt bất kỳ thứ gì trên máy của họTiếp tục theo ví dụ về trình đọc nguồn cấp dữ liệu, bạn sẽ nhận thấy rằng việc chạy tệp thực thi
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
39 mặc định trong thư mục reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
32 sẽ không thành công. May mắn thay, lỗi sau sẽ chỉ cho bạn vấn đềsetup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
3Gói
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
11 đòi hỏi tệp reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
71. Bạn có thể thêm tệp này vào bản dựng bằng tùy chọn reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
97. Dưới đây là một ví dụ về cách đưa vào tệp reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
71 được yêu cầusetup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
4Lệnh này yêu cầu PyInstaller gửi tệp
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
71 vào thư mục reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
11 trong một thư mục mới trong bản dựng của bạn có tên reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
11Lưu ý. command pyinstaller sử dụng ký tự \ để giúp lệnh dễ đọc hơn. Bạn có thể bỏ qua \ khi tự chạy lệnh hoặc sao chép và dán lệnh như bên dưới miễn phí vì bạn đang sử dụng các đường dẫn giống nhau
Bạn sẽ muốn điều chỉnh đường dẫn trong lệnh trên để phù hợp với nơi bạn đã cài đặt phần phụ thuộc của nguồn cấp dữ liệu đọc
Bây giờ, tệp thực thi mới sẽ dẫn đến lỗi mới về tệp
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
18Tệp này được yêu cầu bởi dự án đọc nguồn cấp dữ liệu dự án, vì vậy bạn cần chắc chắn đưa nó vào bản dựng của mình
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
5Một lần nữa, bạn sẽ cần điều chỉnh đường dẫn đến tệp dựa trên nơi bạn có dự án đọc nguồn cấp dữ liệu
Tại thời điểm này, bạn sẽ có một tệp thực thi đang hoạt động có thể được cung cấp trực tiếp cho người dùng
Lỗi thực thi PyInstaller
Như bạn đã thấy ở trên, bạn có thể gặp sự cố khi chạy tệp thực thi của mình. Tùy thuộc vào mức độ phức tạp của dự án của bạn, các bản sửa lỗi có thể đơn giản như bao gồm các tệp dữ liệu như ví dụ về trình đọc nguồn dữ liệu. Tuy nhiên, đôi khi bạn cần nhiều kỹ thuật giảm lỗi hơn
Dưới đây là một số biến chiến lược phổ biến không theo thứ tự cụ thể. Thông thường, một trong những chiến lược này hoặc sự kết hợp sẽ dẫn đến xung đột trong các phiên bản giải quyết vấn đề khó khăn
Use the end end device
Đầu tiên, hãy thử chạy tệp thực thi từ một thiết bị đầu cuối để bạn có thể xem tất cả kết quả đầu ra
Hãy nhớ xóa cờ xây dựng
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
80 để xem tất cả reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
81 trong bảng điều khiển cửa sổ. Thông thường, bạn sẽ thấy các ngoại lệ setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
01 nếu thiếu một phần phụ thuộcError file
Kiểm tra tệp
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
02 xem có vấn đề gì không. PyInstaller tạo ra nhiều đầu ra để giúp bạn hiểu chính xác những gì nó đang tạo. Tìm hiểu xung quanh thư mục reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
62 là một nơi tuyệt vời để bắt đầuMenu set menu
Sử dụng chế độ phân phối
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
04 để tạo thư mục phân phối thay vì tệp thực thi duy nhất. Một lần nữa, đây là chế độ mặc định. Xây dựng với setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
04 cung cấp cho bạn cơ hội để kiểm tra tất cả các phụ thuộc được đưa vào thay vì mọi thứ đều được ẩn trong tệp thực thi duy nhấtsetup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
04 rất hữu ích để khắc phục lỗi, nhưng reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
78 thường dễ hiểu hơn. Sau khi khắc phục lỗi, bạn có thể muốn chuyển sang chế độ reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
78 để đơn giản hóa việc phân phốiTùy chọn CLI bổ sung
PyInstaller cũng có các tùy chọn để kiểm tra giám sát lượng thông tin được đưa vào trong quá trình xây dựng. Xây dựng lại tệp thực thi với tùy chọn
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
09 và xem lại kết quả đầu raPyInstaller sẽ tạo ra nhiều đầu ra khi tăng độ dài với
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
09. Sẽ rất hữu ích khi lưu đầu ra này vào một tệp mà bạn có thể tham khảo sau này thay vì đặt trong Terminal của bạn. Để thực hiện điều này, bạn có thể sử dụng chức năng chuyển hướng của trình bao. This is a ví dụsetup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
6Bằng cách sử dụng lệnh trên, bạn sẽ có một tệp được gọi là
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
11 chứa nhiều thông báo setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
12 bổ sungLưu ý. Chuyển hướng tiêu chuẩn với > là không đủ. PyInstaller trong stream stderr chứ không phải stdout. Điều này có nghĩa là bạn phải chuyển hướng luồng stderr đến một tệp, có thể được thực hiện bằng cách sử dụng 2 như trong lệnh trước
Dưới đây là ví dụ về tệp
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
11 của bạn có thể trông giống như thế nàosetup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
7Tệp này sẽ có nhiều thông tin chi tiết về những thứ được đưa vào trong bản dựng của bạn, tại sao một số thứ không được đưa vào và cách tệp thực thi gói được đóng gói
Bạn có thể xây dựng lại tệp thực thi của mình bằng cách sử dụng tùy chọn
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
14 bên ngoài công việc sử dụng tùy chọn setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
15 để biết thêm thông tinLưu ý. Các tùy chọn -y và --sạch hữu ích khi xây dựng lại, đặc biệt là khi định cấu hình cấm đầu bản hoặc công trình của bạn bằng Tích hợp liên tục. Các tùy chọn này loại bỏ các bản dựng cũ và loại bỏ yêu cầu đầu vào của người dùng trong quá trình xây dựng
Bổ sung tài liệu PyInstaller
PyInstaller GitHub Wiki có rất nhiều liên kết hữu ích và mẹo gỡ rối. Đáng chú ý nhất là các phần về và phải làm gì nếu mọi thứ xảy ra sai sót
Hỗ trợ phát hiện phụ thuộc
Vấn đề biến phổ biến nhất mà bạn sẽ thấy là ngoại lệ
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
01 nếu PyInstaller không thể phát hiện đúng tất cả các phần phụ thuộc của bạn. Như đã đề cập trước đây, điều này có thể xảy ra nếu bạn đang sử dụng setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
42, nhập các hàm bên trong hoặc các loạiNhiều loại sự cố này có thể được giải quyết bằng cách sử dụng tùy chọn
reader/
|
├── reader/
| ├── __init__.py
| ├── __main__.py
| ├── config.cfg
| ├── feed.py
| └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
91. Điều này yêu cầu PyInstaller được đưa vào một mô-đun hoặc gói ngay cả khi nó không tự động phát hiện ra nó. Đây là cách dễ nhất để giải quyết rất nhiều phép nhập động trong ứng dụng của bạnMột cách khác để giải quyết các vấn đề là móc tệp. Tệp này chứa thông tin bổ sung để giúp PyInstaller đóng gói phần phụ thuộc. Bạn có thể viết hook của riêng mình và yêu cầu PyInstaller sử dụng chúng với tùy chọn CLI
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
19Móc tệp là cách PyInstaller tự động hoạt động bên trong nên bạn có thể tìm thấy nhiều mẫu móc tệp trong mã nguồn PyInstaller
Un mode
PyInstaller cực kỳ mạnh mẽ, nhưng nó có một số hạn chế. Một số giới hạn chế độ thảo luận đã được thảo luận. nhập ẩn và nhập tương đối trong lệnh bắt đầu vào tập tin
PyInstaller hỗ trợ tạo tệp thực thi cho Windows, Linux và macOS, nhưng không thể biên dịch chéo. Do đó, bạn không thể thực hiện target target một Hệ điều hành từ Hệ điều hành khác. Vì vậy, để phân phối các tệp thực thi cho nhiều loại HĐH, bạn cần có một máy xây dựng cho mỗi HĐH được hỗ trợ
Liên quan đến giới hạn biên dịch chéo, thật hữu ích khi biết rằng về mặt kỹ thuật PyInstaller không đóng gói hoàn toàn toàn bộ thứ mà ứng dụng của bạn cần để chạy. File thực thi của bạn vẫn phụ thuộc vào người dùng glibc. Thông thường, bạn có thể giải quyết hạn chế
setup[
name="realpython-reader",
version="1.0.0",
description="Read the latest Real Python tutorials",
long_description=README,
long_description_content_type="text/markdown",
url="//github.com/realpython/reader",
author="Real Python",
author_email="info@realpython.com",
license="MIT",
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 3",
],
packages=["reader"],
include_package_data=True,
install_requires=[
"feedparser", "html2text", "importlib_resources", "typing"
],
entry_points={"console_scripts": ["realpython=reader.__main__:main"]},
]
20 bằng cách xây dựng tòa nhà trên phiên bản cũ nhất của mỗi hệ điều hành mà bạn nhắm đến mục tiêuVí dụ. nếu bạn muốn nhắm mục tiêu một loạt máy Linux, thì bạn có thể xây dựng trên phiên bản CentOS cũ hơn. Điều này sẽ cung cấp cho bạn khả năng tương thích với hầu hết các phiên bản mới hơn phiên bản bạn xây dựng. Đây là chiến lược tương tự được mô tả trong PEP 0513 và là những gì mà PyPA khuyến nghị để xây dựng bánh xe tương tự
Trên thực tế, bạn có thể muốn tìm hiểu bằng cách sử dụng hình ảnh docker manylinux của PyPA cho môi trường xây dựng Linux của bạn. Bạn có thể bắt đầu với cấu hình cơ sở ảnh sau đó cài đặt PyInstaller cùng với tất cả các thành phần phụ thuộc của mình và có một cấu hình ảnh xây dựng hỗ trợ hầu hết các biến thể của Linux
Phần kết luận
PyInstaller có thể giúp làm cho các tài liệu cài đặt phức tạp trở nên không cần thiết. Thay vào đó, người dùng của bạn chỉ có thể cần chạy tệp thực thi của bạn để bắt đầu nhanh nhất có thể. Quy trình làm việc của PyInstaller có thể được tóm tắt bằng cách thực hiện như sau
- Create a command file to your main call function
- Cài đặt PyInstaller
- Chạy PyInstaller trên đầu của bạn
- Kiểm tra tệp thực thi mới của bạn
- Gửi kết quả thư mục
63 của bạn cho người dùngreader/ | ├── reader/ | ├── __init__.py | ├── __main__.py | ├── config.cfg | ├── feed.py | └── viewer.py | ├── cli.py ├── LICENSE ├── MANIFEST.in ├── README.md ├── setup.py └── tests
Người dùng của bạn không cần phải biết bạn đã sử dụng phiên bản Python nào hoặc ứng dụng của bạn đang sử dụng Python