Ấu trùng html2text

con trăn. Sử dụng PyInstaller để dễ dàng phân phối các ứng dụng Python
Key learning qua video
Lập trình C Java C# SQL Server PHP HTML5-CSS3-JavaScript
báo cáo quảng cáo này

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 tin

Chuẩ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ã sau

from 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ệu

Việ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ứ ba

Tì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ự á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"]},
]

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
5

Sau 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"]},
]
40

reader/
|
├── 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 PyInstaller

Tuy 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ữ PyInstaller

Bạ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"]},
]
4

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"]},
]
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ụ CLI

Bạ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 đặt

Ví 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ệu

reader/
|
├── 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 
    reader/
    |
    ├── reader/
    |   ├── __init__.py
    |   ├── __main__.py
    |   ├── config.cfg
    |   ├── feed.py
    |   └── viewer.py
    |
    ├── cli.py
    ├── LICENSE
    ├── MANIFEST.in
    ├── README.md
    ├── setup.py
    └── tests
    61
  • 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
    62
  • 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

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
1

reader/
|
├── reader/
|   ├── __init__.py
|   ├── __main__.py
|   ├── config.cfg
|   ├── feed.py
|   └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
3

Tệ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"]},
]
44

There 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 after

reader/
|
├── reader/
|   ├── __init__.py
|   ├── __main__.py
|   ├── config.cfg
|   ├── feed.py
|   └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
7

Bả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ư sau

reader/
|
├── reader/
|   ├── __init__.py
|   ├── __main__.py
|   ├── config.cfg
|   ├── feed.py
|   └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
9

Thư 

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 Windows

Bạ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ập

Lư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ạn

Tạ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ệu

Bạ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 khi

Mộ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
73

Thay đổ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
1

Bạ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ư sau

reader/
|
├── reader/
|   ├── __init__.py
|   ├── __main__.py
|   ├── config.cfg
|   ├── feed.py
|   └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
8

reader/
|
├── 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 thi

Tù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
1

Vớ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ệt

reader/
|
├── reader/
|   ├── __init__.py
|   ├── __main__.py
|   ├── config.cfg
|   ├── feed.py
|   └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
91

Liệ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ệnh

Tù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à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"]},
]
0

Bạ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
98

Hướ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
99

Loạ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"]},
]
1

reader/
|
├── reader/
|   ├── __init__.py
|   ├── __main__.py
|   ├── config.cfg
|   ├── feed.py
|   └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
80

Winding auto open control panel to 

reader/
|
├── reader/
|   ├── __init__.py
|   ├── __main__.py
|   ├── config.cfg
|   ├── feed.py
|   └── viewer.py
|
├── cli.py
├── LICENSE
├── MANIFEST.in
├── README.md
├── setup.py
└── tests
81 nhật ký

Đ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"]},
]
2

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

Như đã đề 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 PyInstaller

Vì 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"]},
]
3

Gó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ầu

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"]},
]
4

Lệ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
11

Lư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
18

Tệ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"]},
]
5

Mộ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ộc

Error 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 đầu

Menu 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ất

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 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ối

Tù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 ra

PyInstaller 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"]},
]
6

Bằ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ổ sung

Lư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à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"]},
]
7

Tệ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 tin

Lư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ại

Nhiề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ạn

Mộ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"]},
]
19

Mó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êu

Ví 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

  1. Create a command file to your main call function
  2. Cài đặt PyInstaller
  3. Chạy PyInstaller trên đầu của bạn
  4. Kiểm tra tệp thực thi mới của bạn
  5. Gửi kết quả 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 cho người dùng

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

Chủ Đề