Làm cách nào để nhập tệp bằng Python?

Nhập trong Python tương tự như #include header_file trong C/C++. Các mô-đun Python có thể truy cập mã từ một mô-đun khác bằng cách nhập tệp/hàm bằng cách nhập. Câu lệnh nhập khẩu là cách phổ biến nhất để gọi máy móc nhập khẩu, nhưng đó không phải là cách duy nhất. Câu lệnh nhập bao gồm từ khóa nhập cùng với tên của mô-đun

Bắt đầu

Ở đây chúng tôi đã tạo một lớp có tên GFG có hai phương thức. thêm() và phụ(). Ngoài ra, một hàm rõ ràng được tạo có tên method() trong cùng một tệp python. This file will act as a module for the main python file

con trăn




GFG
85
GFG
86

GFG
87

GFG
88
GFG
89

GFG
88
GFG
91
GFG
92
GFG
0
GFG
1

GFG
2
GFG
3
GFG
4
GFG
5
GFG
6

GFG
88
GFG
91
GFG
9
GFG
0
GFG
1

GFG
2
GFG
3
GFG
4____6855
GFG
6

GFG
857

GFG
858

GFG
91
GFG
860

GFG
88
GFG
862
GFG
863
GFG
864
GFG
865

Đặt tên của tệp python ở trên là mô-đun. py

nhập khẩu

Bây giờ là lúc để nhập mô-đun và bắt đầu dùng thử lớp và chức năng mới của chúng tôi. Ở đây, chúng ta sẽ import một module có tên là module và tạo đối tượng của lớp tên là GFG bên trong module đó. Now, we can use its methods and variables

con trăn




GFG
866
GFG
867

GFG
868

GFG
869

GFG
870
GFG
871
GFG
872

GFG
868

GFG
874

GFG
862
GFG
863
GFG
870
GFG
878
GFG
879
GFG
880
GFG
881
GFG
882

GFG
862
GFG
863
GFG
870
GFG
886
GFG
879
GFG
880
GFG
881
GFG
882

GFG
868

GFG
892

GFG
893

đầu ra

GFG
4

Việc nhập mô-đun như chúng tôi đã đề cập trước đó sẽ tự động đưa mọi lớp và hiệu suất trong mô-đun vào không gian tên. If you’re only getting to use one function, you’ll prevent the namespace from being cluttered by only importing that function as demonstrated in the program below

Trong Python, bạn sử dụng từ khóa

GFG
544 để cung cấp mã trong một mô-đun trong một mô-đun khác. Nhập trong Python rất quan trọng để cấu trúc mã của bạn một cách hiệu quả. Sử dụng nhập đúng cách sẽ giúp bạn làm việc hiệu quả hơn, cho phép bạn sử dụng lại mã trong khi vẫn duy trì dự án của mình

Hướng dẫn này sẽ cung cấp một cái nhìn tổng quan về câu lệnh

GFG
544 của Python và cách thức hoạt động của nó. Hệ thống nhập rất mạnh và bạn sẽ học cách khai thác sức mạnh này. While you’ll cover many of the concepts behind Python’s import system, this tutorial is mostly example driven. Bạn sẽ học được từ một số ví dụ mã trong suốt

Trong hướng dẫn này, bạn sẽ học cách

  • Use modules, packages, and namespace packages
  • Xử lý các tệp tài nguyên và dữ liệu bên trong các gói của bạn
  • Nhập mô-đun động khi chạy
  • Tùy chỉnh hệ thống nhập của Python

Throughout the tutorial, you’ll see examples of how to play with the Python import machinery in order to work most efficiently. Mặc dù tất cả mã được hiển thị trong hướng dẫn, nhưng bạn cũng có thể tải xuống bằng cách nhấp vào hộp bên dưới

Get the Source Code. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về hệ thống nhập Python trong hướng dẫn này

Python cơ bản GFG544

Mã Python được tổ chức thành cả mô-đun và gói. Phần này sẽ giải thích chúng khác nhau như thế nào và bạn có thể làm việc với chúng như thế nào

Ở phần sau của hướng dẫn, bạn sẽ thấy một số cách sử dụng nâng cao và ít được biết đến của hệ thống nhập của Python. Tuy nhiên, hãy bắt đầu với những điều cơ bản. nhập mô-đun và gói

Remove ads

mô-đun

The Python. thuật ngữ org định nghĩa mô-đun như sau

Một đối tượng phục vụ như một đơn vị tổ chức của mã Python. Modules have a namespace containing arbitrary Python objects. Modules are loaded into Python by the process of importing. (Source)

In practice, a module usually corresponds to one

GFG
547 file containing Python code

Sức mạnh thực sự của các mô-đun là chúng có thể được nhập và sử dụng lại trong mã khác. Xem xét ví dụ sau

>>>

GFG
9

Trong dòng đầu tiên,

GFG
548, bạn nhập mã trong mô-đun
GFG
549 và cung cấp mã đó để sử dụng. In the second line, you access the
GFG
550 variable within the
GFG
549 module.
GFG
549 is part of Python’s standard library, which means that it’s always available to import when you’re running Python

Lưu ý rằng bạn viết

GFG
553 và không chỉ đơn giản là
GFG
550. Ngoài vai trò là một mô-đun,
GFG
549 hoạt động như một không gian tên giữ tất cả các thuộc tính của mô-đun lại với nhau. Không gian tên rất hữu ích để giữ cho mã của bạn dễ đọc và có tổ chức. Theo lời của Tim Peters

Namespaces are one honking great idea—let’s do more of those. (Nguồn)

Bạn có thể liệt kê nội dung của một không gian tên với

GFG
556

>>>

GFG
5

Sử dụng

GFG
556 mà không có bất kỳ đối số nào sẽ hiển thị những gì trong không gian tên chung. To see the contents of the
GFG
549 namespace, you use
GFG
559

Bạn đã thấy cách sử dụng đơn giản nhất của

GFG
544. Tuy nhiên, có nhiều cách khác để sử dụng nó cho phép bạn nhập các phần cụ thể của mô-đun và đổi tên mô-đun khi bạn nhập mô-đun đó

Đoạn mã sau chỉ nhập biến

GFG
550 từ mô-đun
GFG
549

>>>

GFG
6

Lưu ý rằng vị trí này

GFG
550 trong không gian tên chung chứ không phải trong không gian tên
GFG
549

Bạn cũng có thể đổi tên các mô-đun và thuộc tính khi chúng được nhập

>>>

GFG
9

Để biết thêm chi tiết về cú pháp nhập mô-đun, hãy xem Mô-đun và Gói Python – Giới thiệu

gói

Bạn có thể sử dụng một gói để tổ chức thêm các mô-đun của mình. con trăn. thuật ngữ org định nghĩa gói như sau

Một mô-đun Python có thể chứa các mô-đun con hoặc đệ quy, các gói con. Về mặt kỹ thuật, một gói là một mô-đun Python có thuộc tính

GFG
565. (Nguồn)

Lưu ý rằng một gói vẫn là một mô-đun. Là người dùng, bạn thường không cần phải lo lắng về việc bạn đang nhập mô-đun hay gói

Trong thực tế, một gói thường tương ứng với một thư mục tệp chứa các tệp Python và các thư mục khác. Để tự tạo một gói Python, bạn tạo một thư mục và một tệp có tên

GFG
566 bên trong nó. Tệp
GFG
566 chứa nội dung của gói khi được coi là mô-đun. Nó có thể để trống

Ghi chú. Các thư mục không có tệp

GFG
566 vẫn được Python coi là gói. Tuy nhiên, đây sẽ không phải là các gói thông thường, mà là một thứ gọi là gói không gian tên. Bạn sẽ tìm hiểu thêm về chúng sau

Nói chung, các mô-đun con và gói con không được nhập khi bạn nhập một gói. Tuy nhiên, bạn có thể sử dụng

GFG
566 để bao gồm bất kỳ hoặc tất cả các mô hình con và gói con nếu bạn muốn. Để hiển thị một vài ví dụ về hành vi này, bạn sẽ tạo một gói để nói
GFG
570 bằng một vài ngôn ngữ khác nhau. Gói này sẽ bao gồm các thư mục và tệp sau

GFG
6

Mỗi tệp quốc gia in ra lời chào, trong khi tệp

GFG
566 nhập có chọn lọc một số gói con và mô hình con. Nội dung chính xác của các tập tin như sau

GFG
8

Lưu ý rằng

GFG
572 chỉ nhập khẩu
GFG
573 chứ không phải
GFG
574. Tương tự,
GFG
575 không nhập bất cứ thứ gì, trong khi
GFG
576 nhập
GFG
577 và
GFG
578 nhưng không nhập
GFG
579. Mỗi mô-đun quốc gia sẽ in lời chào khi được nhập

Hãy chơi với gói

GFG
580 tại dấu nhắc tương tác để hiểu rõ hơn về cách hoạt động của các gói con và mô-đun con

>>>

GFG
8

Khi

GFG
574 được nhập, các mô-đun
GFG
582 và
GFG
583 cũng được nhập. Bạn có thể thấy điều này vì các mô-đun quốc gia in lời chào khi chúng được nhập

>>>

GFG
2

Tệp

GFG
575 trống. Điều này có nghĩa là việc nhập gói
GFG
585 sẽ tạo không gian tên nhưng không có tác dụng nào khác

>>>

GFG
5

Hãy nhớ rằng, nhập một mô-đun vừa tải nội dung vừa tạo một không gian tên chứa nội dung. Một vài ví dụ cuối cùng cho thấy rằng cùng một mô-đun có thể là một phần của các không gian tên khác nhau

Chi tiết kỹ thuật. Không gian tên mô-đun được triển khai dưới dạng từ điển Python và có sẵn tại thuộc tính

GFG
586

>>>

GFG
7

Bạn hiếm khi cần tương tác trực tiếp với

GFG
586

Tương tự, không gian tên toàn cục của Python cũng là một từ điển. Bạn có thể truy cập nó thông qua

GFG
588

Việc nhập các gói con và mô-đun con trong tệp

GFG
566 là khá phổ biến để cung cấp chúng dễ dàng hơn cho người dùng của bạn. Bạn có thể xem một ví dụ về điều này trong gói
GFG
590 phổ biến

Remove ads

Nhập khẩu tuyệt đối và tương đối

Nhớ lại mã nguồn của

GFG
572 trong ví dụ trước

GFG
50

Bạn đã thấy các câu lệnh của

GFG
592 chẳng hạn như
GFG
593, nhưng dấu chấm (
GFG
594) trong
GFG
595 có nghĩa là gì?

Dấu chấm đề cập đến gói hiện tại và câu lệnh là một ví dụ về nhập tương đối. Bạn có thể đọc nó là “Từ gói hiện tại, nhập gói phụ

GFG
573. ”

Có một câu lệnh nhập tuyệt đối tương đương trong đó bạn đặt tên rõ ràng cho gói hiện tại

GFG
51

Trên thực tế, tất cả các lần nhập trong

GFG
580 có thể đã được thực hiện rõ ràng với các lần nhập tuyệt đối tương tự

Nhập tương đối phải ở dạng

GFG
592 và vị trí bạn đang nhập phải bắt đầu bằng dấu chấm

Hướng dẫn kiểu PEP 8 khuyến nghị sử dụng nhập khẩu tuyệt đối nói chung. Tuy nhiên, nhập khẩu tương đối là một giải pháp thay thế để tổ chức phân cấp gói. Để biết thêm thông tin, hãy xem Nhập tuyệt đối và tương đối trong Python

Đường dẫn nhập của Python

Làm cách nào để Python tìm thấy các mô-đun và gói mà nó nhập? . Hiện tại, chỉ cần biết rằng Python tìm kiếm các mô-đun và gói trong đường dẫn nhập của nó. Đây là danh sách các vị trí được tìm kiếm các mô-đun để nhập

Ghi chú. Khi bạn nhập

GFG
599, Python sẽ tìm kiếm
GFG
600 ở một số vị trí khác nhau trước khi tìm kiếm đường dẫn nhập

Cụ thể, nó sẽ tìm kiếm trong bộ đệm mô-đun để xem liệu

GFG
600 đã được nhập chưa và nó sẽ tìm kiếm trong số các mô-đun tích hợp

Bạn sẽ tìm hiểu thêm về bộ máy nhập Python đầy đủ trong phần sau

Bạn có thể kiểm tra đường dẫn nhập của Python bằng cách in

GFG
602. Broadly speaking, this list will contain three different kinds of locations

  1. The directory of the current script (or the current directory if there’s no script, such as when Python is running interactively)
  2. Nội dung của biến môi trường
    GFG
    603
  3. Các thư mục phụ thuộc vào cài đặt khác

Typically, Python will start at the beginning of the list of locations and look for a given module in each location until the first match. Since the script directory or the current directory is always first in this list, you can make sure that your scripts find your self-made modules and packages by organizing your directories and being careful about which directory you run Python from

Tuy nhiên, bạn cũng nên cẩn thận rằng bạn không tạo các mô-đun che khuất hoặc ẩn các mô-đun quan trọng khác. Ví dụ: giả sử bạn xác định mô-đun

GFG
549 sau

GFG
52

Sử dụng mô-đun này hoạt động như mong đợi

>>>

GFG
53

But this module also shadows the

GFG
549 module that’s included in the standard library. Unfortunately, that means our earlier example of looking up the value of π no longer works

>>>

GFG
54

The problem is that Python now searches your new

GFG
549 module for
GFG
550 instead of searching the
GFG
549 module in the standard library

To avoid these kinds of issues, you should be careful with the names of your modules and packages. In particular, your top-level module and package names should be unique. If

GFG
549 is defined as a submodule within a package, then it won’t shadow the built-in module

Remove ads

Example. Structure Your Imports

While it’s possible to organize your imports by using the current directory as well as by manipulating

GFG
603 and even
GFG
602, the process is often unruly and prone to errors. To see a typical example, consider the following application

GFG
55

The app will re-create a given file structure by creating directories and empty files. Tệp

GFG
612 chứa tập lệnh chính và
GFG
613 là mô-đun thư viện có một số chức năng để xử lý tệp. The following is an example of output from the app, in this case by running it in the
GFG
614 directory

GFG
56

The two source code files as well as the automatically created

GFG
615 file are re-created inside a new directory named
GFG
616

Now take a look at the source code. The main functionality of the app is defined in

GFG
612

GFG
57

In lines 12 to 16, you read a root path from the command line. In the above example you use a dot, which means the current directory. This path will be used as the

GFG
618 of the file hierarchy that you’ll re-create

The actual work happens in lines 19 to 23. First, you create a unique path,

GFG
619, that will be the root of your new file hierarchy. Then you loop through all paths below the original
GFG
618 and re-create them as empty files inside the new file hierarchy

For manipulating paths like this,

GFG
621 in the standard library is quite useful. For more details on how it’s used, check out Python 3’s
GFG
621 Module. Thuần hóa hệ thống tập tin

On line 26, you call

GFG
623. You’ll learn more about the
GFG
624 test on line 25 later. For now, you should know that the special variable
GFG
625 has the value
GFG
626 inside scripts, but it gets the name of the module inside imported modules. For more information on
GFG
625, check out Defining Main Functions in Python and What Does if name == “main” Do in Python?

Note that you import

GFG
628 on line 8. This library module contains two utility functions

GFG
58

GFG
629 uses a counter to find a path that doesn’t already exist. In the app, you use it to find a unique subdirectory to use as the
GFG
619 of the re-created file hierarchy. Next,
GFG
631 makes sure all necessary directories are created before creating an empty file using
GFG
632

Have a look at the import of

GFG
628 again

GFG
59

It looks quite innocent. However, as the project grows, this line will cause you some headaches. Even though you import

GFG
628 from the
GFG
614 project, the import is absolute. it doesn’t start with a dot. This means that
GFG
628 must be found in the import path for the import to work

Luckily, the directory containing the current script is always in Python’s import path, so this works fine for now. However, if your project gains some traction, then it may be used in other ways

For example, someone might want to import the script into a Jupyter Notebook and run it from there. Hoặc họ có thể muốn sử dụng lại thư viện

GFG
628 trong một dự án khác. Họ thậm chí có thể tạo một tệp thực thi bằng PyInstaller để phân phối dễ dàng hơn. Thật không may, bất kỳ tình huống nào trong số này đều có thể tạo ra sự cố khi nhập
GFG
628

Để xem ví dụ, bạn có thể làm theo hướng dẫn PyInstaller và tạo một điểm vào cho ứng dụng của mình. Add an extra directory outside your application directory

GFG
60

Trong thư mục bên ngoài, tạo tập lệnh điểm vào,

GFG
639

GFG
61

Tập lệnh này sẽ nhập

GFG
623 từ tập lệnh gốc của bạn và chạy nó. Lưu ý rằng
GFG
623 không chạy khi
GFG
614 được nhập vì thử nghiệm
GFG
624 trên dòng 25 trong
GFG
612. Điều đó có nghĩa là bạn cần chạy
GFG
623 một cách rõ ràng

Về lý thuyết, điều này sẽ hoạt động tương tự như chạy ứng dụng trực tiếp

GFG
62

Tại sao nó không hoạt động?

Vấn đề là khi khởi động ứng dụng bằng

GFG
639, bạn đã thay đổi vị trí của tập lệnh hiện tại, do đó thay đổi đường dẫn nhập.
GFG
628 không còn trên đường dẫn nhập, vì vậy không thể nhập hoàn toàn

Một giải pháp khả thi là thay đổi đường dẫn nhập của Python

GFG
63

Điều này hoạt động vì đường dẫn nhập bao gồm thư mục chứa

GFG
612 và
GFG
613. Vấn đề với phương pháp này là đường dẫn nhập của bạn có thể rất lộn xộn và khó hiểu

Trên thực tế, bạn đang tạo lại một tính năng của các phiên bản Python đầu tiên được gọi là nhập tương đối ngầm định. Chúng đã bị xóa khỏi ngôn ngữ bởi PEP 328 với lý do sau

Trong Python 2. 4 and earlier, if you’re reading a module located inside a package, it is not clear whether

GFG
651 refers to a top-level module or to another module inside the package. Khi thư viện của Python mở rộng, ngày càng có nhiều mô-đun bên trong gói hiện có đột nhiên che khuất các mô-đun thư viện tiêu chuẩn một cách tình cờ. It’s a particularly difficult problem inside packages because there’s no way to specify which module is meant. (Source)

Another solution is to use a relative import instead. Thay đổi quá trình nhập trong

GFG
612 như sau

GFG
64

You can now start your app through the entry point script

GFG
65

Thật không may, bạn không còn có thể gọi ứng dụng trực tiếp

GFG
66

The problem is that relative imports are resolved differently in scripts than are imported modules. Tất nhiên, bạn có thể quay lại và khôi phục quá trình nhập tuyệt đối trước khi chạy tập lệnh trực tiếp hoặc thậm chí bạn có thể thực hiện một số động tác nhào lộn

GFG
653 để nhập tệp hoàn toàn hoặc tương đối tùy thuộc vào những gì hoạt động

There’s even an officially sanctioned hack to make relative imports work in scripts. Thật không may, điều này cũng buộc bạn phải thay đổi

GFG
602 trong hầu hết các trường hợp. Trích lời Raymond Hettinger

Phải có cách tốt hơn. (Nguồn)

Thật vậy, một giải pháp tốt hơn—và ổn định hơn—là sử dụng cùng với hệ thống nhập và đóng gói của Python và cài đặt dự án của bạn dưới dạng gói cục bộ bằng cách sử dụng

GFG
655

Remove ads

Tạo và cài đặt gói cục bộ

Khi bạn cài đặt một gói từ PyPI, gói đó có sẵn cho tất cả các tập lệnh trong môi trường của bạn. Tuy nhiên, bạn cũng có thể cài đặt các gói từ máy tính cục bộ của mình và chúng cũng sẽ được cung cấp theo cách tương tự

Tạo một gói cục bộ không liên quan đến nhiều chi phí. Đầu tiên, tạo các tệp

GFG
656 và
GFG
657 tối thiểu trong thư mục
GFG
614 bên ngoài

GFG
67

Về lý thuyết,

GFG
659 và
GFG
660 có thể là bất cứ thứ gì bạn thích. Tuy nhiên, chúng sẽ được sử dụng bởi
GFG
655 khi đề cập đến gói của bạn, vì vậy bạn nên chọn các giá trị dễ nhận biết và không xung đột với các gói khác mà bạn sử dụng

Một mẹo là cung cấp cho tất cả các gói cục bộ như vậy một tiền tố chung như

GFG
662 hoặc tên người dùng của bạn.
GFG
663 nên liệt kê thư mục hoặc các thư mục chứa mã nguồn của bạn. Sau đó, bạn có thể cài đặt gói cục bộ bằng cách sử dụng
GFG
655

GFG
68

Lệnh này sẽ cài đặt gói vào hệ thống của bạn.

GFG
614 sau đó sẽ được tìm thấy trên đường dẫn nhập của Python, nghĩa là bạn có thể sử dụng nó ở bất cứ đâu mà không phải lo lắng về thư mục tập lệnh, quá trình nhập tương đối hoặc các biến chứng khác. Tùy chọn
GFG
666 có nghĩa là có thể chỉnh sửa, tùy chọn này rất quan trọng vì tùy chọn này cho phép bạn thay đổi mã nguồn của gói mà không cần cài đặt lại

Ghi chú. Loại tệp thiết lập này hoạt động rất tốt khi bạn tự làm việc với các dự án. Tuy nhiên, nếu bạn định chia sẻ mã với người khác thì bạn nên thêm một số thông tin khác vào tệp thiết lập của mình

For more details on setup files, check out How to Publish an Open-Source Python Package to PyPI

Giờ đây,

GFG
614 đã được cài đặt trên hệ thống của bạn, bạn có thể sử dụng câu lệnh nhập sau

GFG
69

This will work no matter how you end up calling your application

Mẹo. Trong mã của riêng bạn, bạn nên tách biệt các tập lệnh và thư viện một cách có ý thức. Đây là một quy tắc tốt

  • Một kịch bản có nghĩa là để được chạy
  • A library is meant to be imported

You might have code that you want to both run on its own and import from other scripts. In that case, it’s usually worthwhile to refactor your code so that you split the common part into a library module

While it’s a good idea to separate scripts and libraries, all Python files can be both executed and imported. In a later section, you’ll learn more about how to create modules that handle both well

Namespace Packages

Python modules and packages are very closely related to files and directories. This sets Python apart from many other programming languages in which packages merely act as namespaces without enforcing how the source code is organized. See the discussion in PEP 402 for examples

Namespace packages have been available in Python since version 3. 3. These are less dependent on the underlying file hierarchy. Đặc biệt, các gói không gian tên có thể được chia thành nhiều thư mục. A namespace package is created automatically if you have a directory containing a

GFG
547 file but no
GFG
566. See PEP 420 for a detailed explanation

Note. To be precise, implicit namespace packages were introduced in Python 3. 3. In earlier versions of Python, you could create namespace packages manually in several different incompatible ways. PEP 420 thống nhất và đơn giản hóa các phương pháp trước đó

To get a better understanding of why namespace packages can be useful, let’s try to implement one. As a motivating example, you’ll have another go at the problem solved in The Factory Method Pattern and Its Implementation in Python. given a

GFG
670 object, you want to convert it to one of several string representations. Nói cách khác, bạn muốn tuần tự hóa các đối tượng
GFG
670

Để cụ thể hơn, bạn muốn triển khai mã hoạt động giống như thế này

>>>

GFG
90

Giả sử rằng bạn may mắn và bắt gặp một triển khai của bên thứ ba cho một số định dạng mà bạn cần sắp xếp theo thứ tự và nó được tổ chức dưới dạng gói không gian tên

GFG
91

Tệp

GFG
672 chứa mã có thể tuần tự hóa một đối tượng thành định dạng JSON

GFG
92

Giao diện bộ nối tiếp này có một chút hạn chế, nhưng nó sẽ đủ để chứng minh cách các gói không gian tên hoạt động

Tệp

GFG
673 chứa một
GFG
674 tương tự có thể chuyển đổi một đối tượng thành XML

GFG
93

Lưu ý rằng cả hai lớp này đều triển khai cùng một giao diện với các phương thức

GFG
675,
GFG
676 và
GFG
677

Sau đó, bạn tạo một lớp

GFG
670 có thể sử dụng các bộ nối tiếp này

GFG
94

Một

GFG
670 được xác định bởi ID, tiêu đề và nghệ sĩ của nó. Lưu ý rằng
GFG
680 không cần biết nó chuyển đổi sang định dạng nào vì nó sử dụng giao diện chung được xác định trước đó

Giả sử rằng bạn đã cài đặt gói

GFG
681 của bên thứ ba, bạn có thể sử dụng nó như sau

>>>

GFG
95

Bằng cách cung cấp các đối tượng nối tiếp khác nhau cho

GFG
680, bạn sẽ nhận được các bản trình bày khác nhau cho bài hát của mình

Ghi chú. Bạn có thể nhận được một

GFG
683 hoặc một
GFG
684 khi tự chạy mã. Điều này là do
GFG
681 không có trong đường dẫn nhập Python của bạn. Bạn sẽ sớm biết cách giải quyết vấn đề đó

Càng xa càng tốt. Tuy nhiên, bây giờ bạn nhận ra rằng bạn cũng cần chuyển đổi các bài hát của mình sang biểu diễn YAML, không được hỗ trợ trong thư viện của bên thứ ba. Nhập sự kỳ diệu của các gói không gian tên. bạn có thể thêm

GFG
686 của riêng mình vào gói
GFG
681 mà không cần chạm vào thư viện của bên thứ ba

Đầu tiên, tạo một thư mục trên hệ thống tệp cục bộ của bạn có tên là

GFG
681. Điều quan trọng là tên của thư mục phải khớp với tên của gói không gian tên mà bạn đang tùy chỉnh

GFG
96

Trong tệp

GFG
689, bạn xác định
GFG
686 của riêng mình. Bạn căn cứ vào gói
GFG
691, gói này phải được cài đặt từ PyPI

GFG
97

Vì YAML và JSON có các định dạng khá giống nhau nên bạn có thể sử dụng lại hầu hết việc triển khai của

GFG
692

GFG
98

Lưu ý rằng

GFG
686 dựa trên
GFG
692, được nhập từ chính
GFG
681. Vì cả
GFG
696 và
GFG
697 đều là một phần của cùng một gói không gian tên, bạn thậm chí có thể sử dụng nhập tương đối.
GFG
698

Tiếp tục ví dụ trên, bây giờ bạn cũng có thể chuyển đổi bài hát sang YAML

>>>

GFG
99

Cũng giống như các gói và mô-đun thông thường, các gói không gian tên phải được tìm thấy trên đường dẫn nhập Python. Nếu bạn đang làm theo các ví dụ trước, thì bạn có thể gặp sự cố với việc Python không tìm thấy

GFG
681. Trong mã thực tế, bạn sẽ sử dụng
GFG
655 để cài đặt thư viện của bên thứ ba, do đó, nó sẽ tự động nằm trong đường dẫn của bạn

Ghi chú. Trong ví dụ ban đầu, việc lựa chọn bộ nối tiếp được thực hiện linh hoạt hơn. Bạn sẽ thấy cách sử dụng các gói không gian tên theo mẫu phương thức xuất xưởng thích hợp sau này

You should also make sure that your local library is available like a normal package. Như đã giải thích ở trên, bạn có thể thực hiện việc này bằng cách chạy Python từ thư mục thích hợp hoặc bằng cách sử dụng

GFG
655 để cài đặt thư viện cục bộ.

Trong ví dụ này, bạn đang kiểm tra cách tích hợp gói bên thứ ba giả mạo với gói cục bộ của mình. Nếu

GFG
902 là một gói thực, thì bạn sẽ tải xuống từ PyPI bằng cách sử dụng
GFG
655. Vì điều này là không thể, bạn có thể mô phỏng nó bằng cách cài đặt
GFG
902 cục bộ giống như bạn đã làm trong ví dụ
GFG
614 trước đó

Ngoài ra, bạn có thể gây rối với đường dẫn nhập của mình. Đặt các thư mục

GFG
902 và
GFG
907 trong cùng một thư mục, sau đó tùy chỉnh đường dẫn Python của bạn như sau

>>>

GFG
60

Giờ đây, bạn có thể sử dụng tất cả các bộ nối tiếp mà không phải lo lắng về việc chúng được xác định trong gói của bên thứ ba hay cục bộ

Remove ads

Hướng dẫn phong cách nhập khẩu

PEP 8, hướng dẫn kiểu Python, có một số đề xuất về nhập. Như mọi khi với Python, giữ cho mã của bạn vừa có thể đọc được vừa có thể bảo trì là một điều quan trọng cần cân nhắc. Dưới đây là một số quy tắc chung về cách tạo kiểu cho hàng nhập của bạn

  • Giữ nhập ở đầu tệp
  • Viết nhập trên các dòng riêng biệt
  • Tổ chức nhập khẩu thành các nhóm. nhập thư viện tiêu chuẩn đầu tiên, sau đó nhập của bên thứ ba và cuối cùng là nhập thư viện hoặc ứng dụng cục bộ
  • Đặt hàng nhập khẩu theo thứ tự bảng chữ cái trong mỗi nhóm
  • Thích nhập khẩu tuyệt đối hơn nhập khẩu tương đối
  • Tránh nhập ký tự đại diện như
    GFG
    908

GFG
909 và
GFG
910 là những công cụ tuyệt vời để thực thi một phong cách nhất quán đối với hàng nhập của bạn

Đây là một ví dụ về phần nhập bên trong gói trình đọc nguồn cấp Python thực

GFG
61

Lưu ý cách nhóm này làm cho các phụ thuộc của mô-đun này rõ ràng.

GFG
911 và
GFG
912 cần được cài đặt trên hệ thống. Nói chung, bạn có thể cho rằng thư viện tiêu chuẩn có sẵn. Việc tách nhập khẩu từ bên trong gói của bạn cung cấp cho bạn một số tổng quan về các phụ thuộc nội bộ của mã của bạn

Có những trường hợp nên bẻ cong các quy tắc này một chút. Bạn đã thấy rằng nhập tương đối có thể là một giải pháp thay thế cho việc tổ chức phân cấp gói. Sau này, bạn sẽ thấy trong một số trường hợp, bạn có thể di chuyển quá trình nhập vào định nghĩa hàm để phá vỡ các chu kỳ nhập như thế nào

Nhập tài nguyên

Đôi khi, bạn sẽ có mã phụ thuộc vào tệp dữ liệu hoặc các tài nguyên khác. Trong các tập lệnh nhỏ, đây không phải là vấn đề—bạn có thể chỉ định đường dẫn đến tệp dữ liệu của mình và tiếp tục

Tuy nhiên, nếu tệp tài nguyên quan trọng đối với gói của bạn và bạn muốn phân phối gói của mình cho những người dùng khác, thì một số thách thức sẽ phát sinh

  1. Bạn sẽ không có quyền kiểm soát đường dẫn đến tài nguyên vì điều đó sẽ phụ thuộc vào thiết lập của người dùng cũng như cách gói được phân phối và cài đặt. Bạn có thể cố gắng tìm ra đường dẫn tài nguyên dựa trên các thuộc tính

    GFG
    913 hoặc
    GFG
    565 của gói, nhưng điều này có thể không phải lúc nào cũng hoạt động như mong đợi

  2. Gói của bạn có thể nằm trong tệp ZIP hoặc tệp

    GFG
    915 cũ, trong trường hợp đó, tài nguyên thậm chí sẽ không phải là tệp vật lý trên hệ thống của người dùng

Đã có một số nỗ lực giải quyết những thách thức này, bao gồm cả

GFG
916. However, with the introduction of
GFG
917 into the standard library in Python 3. 7, hiện có một cách tiêu chuẩn để xử lý các tệp tài nguyên

Giới thiệu GFG917

GFG
917 cấp quyền truy cập vào tài nguyên trong các gói. Trong ngữ cảnh này, tài nguyên là bất kỳ tệp nào nằm trong gói có thể nhập. Tệp có thể tương ứng hoặc không tương ứng với tệp vật lý trên hệ thống tệp

Điều này có một vài lợi thế. Bằng cách sử dụng lại hệ thống nhập, bạn sẽ có cách xử lý nhất quán hơn với các tệp bên trong các gói của mình. Nó cũng cho phép bạn truy cập dễ dàng hơn vào các tệp tài nguyên trong các gói khác. Các tài liệu tổng hợp nó độc đáo

Nếu bạn có thể nhập một gói, bạn có thể truy cập các tài nguyên trong gói đó. (Nguồn)

GFG
917 đã trở thành một phần của thư viện chuẩn trong Python 3. 7. Tuy nhiên, trên các phiên bản Python cũ hơn, một cổng sau có sẵn dưới dạng
GFG
921. To use the backport, install it from PyPI

GFG
62

Backport tương thích với Python 2. 7 cũng như Python 3. 4 and later versions

Có một yêu cầu khi sử dụng

GFG
917. các tệp tài nguyên của bạn phải có sẵn bên trong một gói thông thường. Gói không gian tên không được hỗ trợ. Trong thực tế, điều này có nghĩa là tệp phải nằm trong thư mục chứa tệp
GFG
566

Ví dụ đầu tiên, giả sử bạn có tài nguyên bên trong một gói như thế này

GFG
63

GFG
566 chỉ là một tệp trống cần thiết để chỉ định
GFG
925 như một gói thông thường

Sau đó, bạn có thể sử dụng

GFG
926 và
GFG
927 để mở tệp văn bản và tệp nhị phân tương ứng

>>>

GFG
64

GFG
926 và
GFG
927 tương đương với
GFG
930 tích hợp sẵn với tham số
GFG
931 được đặt lần lượt là
GFG
932 và
GFG
933. Các chức năng thuận tiện để đọc văn bản hoặc tệp nhị phân trực tiếp cũng có sẵn như
GFG
934 và
GFG
935. Xem tài liệu chính thức để biết thêm thông tin

Note. Để liên tục quay lại sử dụng backport trên các phiên bản Python cũ hơn, bạn có thể nhập

GFG
917 như sau

GFG
65

Xem phần mẹo và thủ thuật của hướng dẫn này để biết thêm thông tin

The rest of this section will show a few elaborate examples of using resource files in practice

Remove ads

Thí dụ. Sử dụng tệp dữ liệu

Là một ví dụ đầy đủ hơn về việc sử dụng tệp dữ liệu, bạn sẽ thấy cách triển khai chương trình đố vui dựa trên dữ liệu dân số của Liên hợp quốc. Đầu tiên, tạo gói

GFG
937 và tải xuống
GFG
938 từ trang web của Liên hợp quốc

GFG
66

Mở tệp CSV và xem dữ liệu

GFG
67

Mỗi dòng chứa dân số của một quốc gia trong một năm nhất định và một biến thể nhất định, cho biết loại kịch bản nào được sử dụng để chiếu. Tệp chứa dự báo dân số cho đến năm 2100

The following function reads this file and picks out the total population of each country for a given

GFG
939 and
GFG
940

GFG
68

Các dòng được đánh dấu cho biết cách sử dụng

GFG
917 để mở tệp dữ liệu. Để biết thêm thông tin về cách làm việc với tệp CSV, hãy xem Đọc và ghi tệp CSV bằng Python

Hàm trên trả về một từ điển có số dân

>>>

GFG
69

Bạn có thể thực hiện bất kỳ điều thú vị nào với từ điển dân số này, bao gồm phân tích và trực quan hóa. Tại đây, bạn sẽ tạo một trò chơi đố vui yêu cầu người dùng xác định quốc gia nào trong nhóm đông dân nhất. Chơi trò chơi sẽ giống như thế này

GFG
80

Các chi tiết của việc triển khai nằm quá xa chủ đề của hướng dẫn này, vì vậy chúng sẽ không được thảo luận ở đây. Tuy nhiên, bạn có thể mở rộng phần bên dưới để xem mã nguồn hoàn chỉnh

Mã nguồn của bài kiểm tra dân sốHiển thị/Ẩn

Bài kiểm tra dân số bao gồm hai chức năng, một chức năng đọc dữ liệu dân số như bạn đã làm ở trên và một chức năng chạy bài kiểm tra thực tế

GFG
81

Lưu ý rằng ở dòng 24, bạn cũng kiểm tra xem ________ 3942 có nhỏ hơn ________ 3943 không. Các vị trí có

GFG
942 của
GFG
943 trở lên không phải là quốc gia thích hợp, mà là các tập hợp như
GFG
946,
GFG
947, v.v.

Thí dụ. Thêm biểu tượng vào GUI Tkinter

Khi xây dựng giao diện người dùng đồ họa (GUI), bạn thường cần bao gồm các tệp tài nguyên như biểu tượng. Ví dụ sau đây cho thấy cách bạn có thể làm điều đó bằng cách sử dụng

GFG
917. Ứng dụng cuối cùng sẽ trông khá cơ bản, nhưng nó sẽ có biểu tượng tùy chỉnh cũng như hình minh họa trên nút Tạm biệt

Làm cách nào để nhập tệp bằng Python?

Ví dụ sử dụng Tkinter, một gói GUI có sẵn trong thư viện chuẩn. Nó dựa trên hệ thống cửa sổ Tk, ban đầu được phát triển cho ngôn ngữ lập trình Tcl. Có nhiều gói GUI khác có sẵn cho Python. Nếu bạn đang sử dụng một ứng dụng khác, thì bạn có thể thêm các biểu tượng vào ứng dụng của mình bằng các ý tưởng tương tự như những ý tưởng được trình bày ở đây

Trong Tkinter, hình ảnh được xử lý bởi lớp

GFG
949. Để tạo một
GFG
949, bạn chuyển vào một đường dẫn đến một tệp hình ảnh

Hãy nhớ rằng, khi phân phối gói của bạn, bạn thậm chí không đảm bảo rằng các tệp tài nguyên sẽ tồn tại dưới dạng tệp vật lý trên hệ thống tệp.

GFG
917 giải quyết vấn đề này bằng cách cung cấp
GFG
952. Hàm này sẽ trả về đường dẫn đến tệp tài nguyên, tạo tệp tạm thời nếu cần

Để đảm bảo mọi tệp tạm thời được dọn sạch đúng cách, bạn nên sử dụng

GFG
952 làm trình quản lý ngữ cảnh bằng từ khóa
GFG
954

>>>

GFG
82

Đối với ví dụ đầy đủ, giả sử bạn có hệ thống phân cấp tệp sau

GFG
83

Nếu bạn muốn tự mình thử ví dụ, thì bạn có thể tải xuống các tệp này cùng với phần còn lại của mã nguồn được sử dụng trong hướng dẫn này bằng cách nhấp vào liên kết bên dưới

Get the Source Code. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về hệ thống nhập Python trong hướng dẫn này

Mã được lưu trữ trong một tệp có tên đặc biệt

GFG
955. Tên này chỉ ra rằng tệp là điểm vào cho gói. Có tệp
GFG
955 cho phép gói của bạn được thực thi với
GFG
957

GFG
84

Để biết thêm thông tin về cách gọi gói bằng

GFG
958, hãy xem Cách xuất bản Gói Python nguồn mở lên PyPI

GUI được định nghĩa trong một lớp có tên là

GFG
959. Lưu ý rằng bạn sử dụng
GFG
917 để lấy đường dẫn của tệp hình ảnh

GFG
85

Nếu bạn muốn tìm hiểu thêm về cách xây dựng GUI với Tkinter, hãy xem Lập trình GUI Python với Tkinter. Tài liệu chính thức cũng có một danh sách tài nguyên hay để bắt đầu và hướng dẫn tại TkDocs là một tài nguyên tuyệt vời khác cho biết cách sử dụng Tk trong các ngôn ngữ khác

Ghi chú. Một nguyên nhân gây nhầm lẫn và thất vọng khi làm việc với hình ảnh trong Tkinter là bạn phải đảm bảo hình ảnh không bị thu gom rác. Do cách tương tác của Python và Tk, trình thu gom rác trong Python (ít nhất là trong CPython) không đăng ký rằng hình ảnh được sử dụng bởi

GFG
961 và
GFG
962

Để đảm bảo rằng hình ảnh được lưu giữ xung quanh, bạn nên thêm tham chiếu đến chúng theo cách thủ công. Bạn có thể xem các ví dụ về điều này trong đoạn mã trên ở dòng 18 và 31

Remove ads

Nhập động

Một trong những tính năng xác định của Python là nó là một ngôn ngữ rất năng động. Mặc dù đôi khi đó là một ý tưởng tồi, nhưng bạn có thể thực hiện nhiều việc với chương trình Python khi nó đang chạy, bao gồm thêm thuộc tính vào lớp, xác định lại phương thức hoặc thay đổi chuỗi tài liệu của mô-đun. Chẳng hạn, bạn có thể thay đổi

GFG
963 để nó không làm gì cả

>>>

GFG
86

Về mặt kỹ thuật, bạn không định nghĩa lại

GFG
963. Thay vào đó, bạn đang xác định một
GFG
963 khác che khuất cái tích hợp sẵn. Để quay lại sử dụng
GFG
963 ban đầu, bạn có thể xóa tài khoản tùy chỉnh của mình bằng
GFG
967. Nếu muốn, bạn có thể tạo bóng cho bất kỳ đối tượng Python nào được tích hợp trong trình thông dịch

Ghi chú. In the above example, you redefine

GFG
963 using a lambda function. Bạn cũng có thể đã sử dụng một định nghĩa chức năng bình thường

>>>

GFG
87

Để tìm hiểu thêm về các hàm lambda, hãy xem Cách sử dụng các hàm Lambda của Python

Trong phần này, bạn sẽ tìm hiểu cách nhập động trong Python. Với chúng, bạn sẽ không phải quyết định nhập nội dung gì cho đến khi chương trình của bạn đang chạy

Sử dụng GFG969

Cho đến giờ, bạn đã sử dụng từ khóa

GFG
544 của Python để nhập các mô-đun và gói một cách rõ ràng. However, the whole import machinery is available in the
GFG
969 package, and this allows you to do your imports more dynamically. Đoạn script sau hỏi người dùng tên của một mô-đun, nhập mô-đun đó và in chuỗi tài liệu của nó

GFG
88

GFG
972 returns a module object that you can bind to any variable. Sau đó, bạn có thể coi biến đó là một mô-đun được nhập thường xuyên. Bạn có thể sử dụng kịch bản như thế này

GFG
89

Trong mỗi trường hợp, mô-đun được nhập động bởi

GFG
972

Thí dụ. Phương thức xuất xưởng với các gói không gian tên

Think back to the serializers example from earlier. Với

GFG
681 được triển khai dưới dạng gói không gian tên, bạn có khả năng thêm các bộ nối tiếp tùy chỉnh. Trong ví dụ ban đầu từ hướng dẫn trước, các bộ nối tiếp được cung cấp thông qua một nhà máy sản xuất bộ nối tiếp. Sử dụng
GFG
969, bạn có thể làm điều gì đó tương tự

Add the following code to your local

GFG
681 namespace package

GFG
80

The

GFG
977 factory can create serializers dynamically based on the
GFG
978 parameter, and
GFG
979 can then apply the serializer to any object that implements a
GFG
680 method

The factory makes some strong assumptions about the naming of both the module and the class containing the individual serializers. In the next section, you’ll learn about a plugin architecture that allows more flexibility

Bây giờ bạn có thể tạo lại ví dụ trước đó như sau

>>>

GFG
81

In this case, you no longer need to explicitly import each serializer. Thay vào đó, bạn chỉ định tên của bộ nối tiếp bằng một chuỗi. The string could even be chosen by your user at runtime

Note. In a regular package, you probably would have implemented

GFG
977 and
GFG
979 in an
GFG
566 file. Điều đó sẽ cho phép bạn chỉ cần nhập
GFG
681 và sau đó gọi
GFG
985

Tuy nhiên, các gói không gian tên không được phép sử dụng

GFG
566, vì vậy bạn cần triển khai các chức năng này trong một mô-đun riêng để thay thế

The final example shows that you also get a decent error message if you try to serialize to a format that hasn’t been implemented

Remove ads

Example. Một gói plugin

Let’s look at another example of using dynamic imports. Bạn có thể sử dụng mô-đun sau để thiết lập kiến ​​trúc plugin linh hoạt trong mã của mình. This is similar to the previous example, in which you could plug in serializers for different formats by adding new modules

Một ứng dụng sử dụng plugin hiệu quả là công cụ trực quan hóa khám phá Keo. Glue can read many different data formats out of the box. However, if your data format isn’t supported, then you can write your own custom data loader

Bạn làm điều này bằng cách thêm một chức năng mà bạn trang trí và đặt ở một vị trí đặc biệt để Keo dễ dàng tìm thấy. Bạn không cần thay đổi bất kỳ phần nào của mã nguồn Keo. See the documentation for all the details

You can set up a similar plugin architecture that you can use in your own projects. Within the architecture, there are two levels

  1. Gói plugin là tập hợp các plugin có liên quan tương ứng với gói Python
  2. A plugin is a custom behavior made available in a Python module

The

GFG
987 module that exposes the plugin architecture has the following functions

GFG
82

The factory functions are used to conveniently add functionality to plugin packages. Bạn sẽ thấy một số ví dụ về cách chúng được sử dụng trong thời gian ngắn

Looking at all the details of this code is outside the scope of this tutorial. If you’re interested, then you can see an implementation by expanding the section below

Complete Source Code of plugins. pyHiện/Ẩn

The following code shows the implementation of

GFG
988 described above

GFG
83

This implementation is a bit simplified. Đặc biệt, nó không thực hiện bất kỳ xử lý lỗi rõ ràng nào. Check out the PyPlugs project for a more complete implementation

Bạn có thể thấy rằng

GFG
989 sử dụng
GFG
990 để tải động các plugin. Additionally,
GFG
991 uses
GFG
992 to list all available plugins in a given package

Hãy xem xét một số ví dụ về cách sử dụng plugin. The first example is a

GFG
993 package that you can use to add many different greetings to your app. A full plugin architecture is definitely overkill for this example, but it shows how the plugins work

Assume you have the following

GFG
993 package

GFG
84

Mỗi mô-đun

GFG
993 định nghĩa một hàm nhận một đối số
GFG
659. Note how they’re all registered as plugins using the
GFG
997 decorator

GFG
85

To learn more about decorators and how they’re used, check out Primer on Python Decorators

Note. Để đơn giản hóa việc khám phá và nhập plugin, tên của mỗi plugin dựa trên tên của mô-đun chứa nó thay vì tên chức năng. This restricts you to having only one plugin per file

To finish setting up

GFG
993 as a plugin package, you can use the factory functions in
GFG
987 to add functionality to the
GFG
993 package itself

GFG
86

You can now use

GFG
601 and
GFG
602 as follows

>>>

GFG
87

Note that

GFG
601 automatically discovers all the plugins that are available in the package

You can also more dynamically choose which plugin to call. In the following example, you choose a plugin at random. However, you could also select a plugin based on a configuration file or user input

>>>

GFG
88

To discover and call the different plugins, you need to import them. Hãy xem nhanh cách

GFG
987 xử lý việc nhập. Công việc chính được thực hiện ở hai chức năng sau bên trong
GFG
988

GFG
89

GFG
989 trông có vẻ đơn giản. Nó sử dụng
GFG
969 để nhập một mô-đun. But there are a couple of things also happening in the background

  1. Python’s import system ensures that each plugin is imported only once
  2. GFG
    997 decorators defined inside each plugin module register each imported plugin
  3. In a full implementation, there would also be some error handling to deal with missing plugins

GFG
991 discovers all the plugins within a package. Here’s how it works

  1. GFG
    610 from
    GFG
    917 lists all the files inside a package
  2. The results are filtered to find potential plugins
  3. Each Python file not starting with an underscore is imported
  4. Plugins in any of the files are discovered and registered

Let’s end this section with a final version of the serializers namespace package. One outstanding issue was that the

GFG
977 factory made strong assumptions about the naming of the serializer classes. You can make this more flexible using plugins

First, add a line registering each of the serializers. Here is an example of how it’s done in the

GFG
697 serializer

GFG
20

Next, update

GFG
614 to use
GFG
987

GFG
21

Bạn triển khai

GFG
977 bằng cách sử dụng
GFG
617 vì điều đó sẽ tự động khởi tạo từng bộ nối tiếp. With this refactoring, the serializers work just the same as earlier. However, you have more flexibility in naming your serializer classes

Để biết thêm thông tin về cách sử dụng plugin, hãy xem PyPlugs trên PyPI và các Trình cắm. Adding Flexibility to Your Apps presentation from PyCon 2019

Remove ads

The Python Import System

You’ve seen many ways to take advantage of Python’s import system. In this section, you’ll learn a bit more about what happens behind the scenes as modules and packages are imported

As with most parts of Python, the import system can be customized. You’ll see several ways that you can change the import system, including automatically downloading missing packages from PyPI and importing data files as if they were modules

Nhập nội bộ

The details of the Python import system are described in the official documentation. At a high level, three things happen when you import a module (or package). The module is

  1. Searched for
  2. Loaded
  3. Bound to a namespace

For the usual imports—those done with the

GFG
544 statement—all three steps happen automatically. Tuy nhiên, khi bạn sử dụng
GFG
969, chỉ có hai bước đầu tiên là tự động. Bạn cần tự liên kết mô-đun với một biến hoặc không gian tên

For instance, the following methods of importing and renaming

GFG
553 are roughly equivalent

>>>

GFG
22

Of course, in normal code you should prefer the former

One thing to note is that, even when you import only one attribute from a module, the whole module is loaded and executed. The rest of the contents of the module just aren’t bound to the current namespace. Một cách để chứng minh điều này là xem cái được gọi là bộ đệm mô-đun

>>>

GFG
23

GFG
621 hoạt động như một bộ đệm mô-đun. It contains references to all modules that have been imported

Bộ đệm mô-đun đóng một vai trò rất quan trọng trong hệ thống nhập Python. The first place Python looks for modules when doing an import is in

GFG
621. If a module is already available, then it isn’t loaded again

This is a great optimization, but it’s also a necessity. Nếu các mô-đun được tải lại mỗi khi chúng được nhập, thì bạn có thể gặp phải tình trạng không nhất quán trong một số trường hợp nhất định, chẳng hạn như khi mã nguồn cơ bản thay đổi trong khi tập lệnh đang chạy

Recall the import path you saw earlier. It essentially tells Python where to search for modules. However, if Python finds a module in the module cache, then it won’t bother searching the import path for the module

Example. Singletons as Modules

In object-oriented programming, a singleton is a class with at most one instance. While it’s possible to implement singletons in Python, most good uses of singletons can be handled by modules instead. You can trust the module cache to instantiate a class only once

As an example, let’s return to the United Nations population data you saw earlier. The following module defines a class wrapping the population data

GFG
24

Reading the data from disk takes some time. Since you don’t expect the data file to change, you instantiate the class when you load the module. The name of the class starts with an underscore to indicate to users that they shouldn’t use it

You can use the

GFG
623 singleton to create a Matplotlib graph showing the population projection for the most populous countries

>>>

GFG
25

Điều này tạo ra một biểu đồ như sau

Làm cách nào để nhập tệp bằng Python?

Lưu ý rằng việc tải dữ liệu tại thời điểm nhập là một loại phản mẫu. Ideally, you want your imports to be as free of side effects as possible. Cách tiếp cận tốt hơn là tải dữ liệu một cách lười biếng khi bạn cần. You can do this quite elegantly using properties. Expand the following section to see an example

Lazily Loading Population DataShow/Hide

The lazy implementation of

GFG
624 stores the population data in
GFG
625 the first time it’s read. Thuộc tính
GFG
626 xử lý bộ đệm dữ liệu này

GFG
26

Now the data won’t be loaded at import time. Instead, it’ll be imported the first time you access the

GFG
627 dictionary. For more information about properties and the more general concept of descriptors, see Python Descriptors. Một lời giới thiệu

Remove ads

Reloading Modules

The module cache can be a little frustrating when you’re working in the interactive interpreter. Tải lại một mô-đun sau khi bạn thay đổi nó không phải là chuyện nhỏ. For example, take a look at the following module

GFG
27

Là một phần của quá trình thử nghiệm và gỡ lỗi mô-đun này, bạn nhập nó vào bảng điều khiển Python

>>>

GFG
28

Let’s say you realize that you have a bug in your code, so you update the

GFG
628 file in your editor

GFG
29

Returning to your console, you import the updated module to see the effect of your fix

>>>

GFG
28

Why is the answer still

GFG
629? The module cache is doing its (now frustrating) magic. since Python imported
GFG
630 earlier, it sees no reason to load the module again even though you just changed it

The most straightforward solution to this is to exit the Python console and restart it. This forces Python to clear its module cache as well

>>>

GFG
51

However, restarting the interpreter isn’t always feasible. You might be in a more complicated session that has taken you a long time to set up. If that’s the case, then you can use

GFG
631 to reload a module instead

>>>

GFG
52

Note that

GFG
632 requires a module object, not a string like
GFG
972 does. Ngoài ra, hãy lưu ý rằng
GFG
632 có một số lưu ý. In particular, variables referring to objects within a module are not re-bound to new objects when that module is reloaded. See the documentation for more details

Finders and Loaders

Bạn đã thấy trước đó rằng việc tạo các mô-đun có cùng tên với các thư viện tiêu chuẩn có thể gây ra sự cố. For example, if you have a file named

GFG
635 in Python’s import path, then you won’t be able to import
GFG
549 from the standard library

This isn’t always the case, though. Tạo một tệp tên là

GFG
637 với nội dung sau

GFG
53

Tiếp theo, mở trình thông dịch Python và nhập mô-đun mới này

>>>

GFG
54

Một cái gì đó kỳ lạ đã xảy ra. It doesn’t seem like Python imported your new

GFG
638 module. Instead, it imported the
GFG
638 module from the standard library. Tại sao các mô-đun thư viện tiêu chuẩn hoạt động không nhất quán?

>>>

GFG
55

You can see that

GFG
549 is imported from a file, whereas
GFG
638 is some kind of built-in module. It seems that built-in modules aren’t shadowed by local ones

Ghi chú. The built-in modules are compiled into the Python interpreter. Typically, they’re foundational modules like

GFG
642,
GFG
643, and
GFG
638. Which modules are built in depends on your Python interpreter, but you can find their names in
GFG
645

Let’s dig even deeper into Python’s import system. This will also show why built-in modules aren’t shadowed by local ones. There are several steps involved when importing a module

  1. Python kiểm tra xem mô-đun có sẵn trong bộ đệm mô-đun không. If

    GFG
    621 contains the name of the module, then the module is already available, and the import process ends

  2. Python bắt đầu tìm kiếm mô-đun bằng một số công cụ tìm. A finder will search for the module using a given strategy. Công cụ tìm mặc định có thể nhập các mô-đun tích hợp, mô-đun cố định và mô-đun trên đường dẫn nhập

  3. Python loads the module using a loader. Which loader Python uses is determined by the finder that located the module and is specified in something called a module spec

You can extend the Python import system by implementing your own finder and, if necessary, your own loader. You’ll see a more useful example of a finder later. For now, you’ll learn how to do basic (and possibly silly) customizations of the import system

GFG
647 controls which finders are called during the import process

>>>

GFG
56

Đầu tiên, lưu ý rằng điều này trả lời câu hỏi từ trước đó. built-in modules aren’t shadowed by local modules because the built-in finder is called before the import path finder, which finds local modules. Thứ hai, lưu ý rằng bạn có thể tùy chỉnh

GFG
647 theo ý thích của mình

Để nhanh chóng làm rối phiên Python của bạn, bạn có thể xóa tất cả các công cụ tìm

>>>

GFG
57

Since there are no finders, Python can’t find or import new modules. However, Python can still import modules that are already in the module cache since it looks there before calling any finders

In the example above,

GFG
969 was already loaded under the hood before you cleared the list of finders. If you really want to make your Python session completely unusable, then you can also clear the module cache,
GFG
621

The following is a slightly more useful example. You’ll write a finder that prints a message to the console identifying the module being imported. The example shows how to add your own finder, although it doesn’t actually attempt to find a module

GFG
58

All finders must implement a

GFG
651 class method, which should try to find a given module. There are three ways that
GFG
651 can terminate

  1. By returning
    GFG
    653 if it doesn’t know how to find and load the module
  2. By returning a module spec specifying how to load the module
  3. By raising a
    GFG
    683 to indicate that the module can’t be imported

The

GFG
655 prints a message to the console and then explicitly returns
GFG
653 to indicate that other finders should figure out how to actually import the module

Ghi chú. Since Python implicitly returns

GFG
653 from any function or method without an explicit
GFG
658, you can leave out line 9. However, in this case it’s good to include
GFG
659 to make it clear that
GFG
655 doesn’t find a module

By inserting

GFG
655 first in the list of finders, you get a running list of all modules being imported

>>>

GFG
59

You can, for instance, see that importing

GFG
662 triggers the import of several other modules that
GFG
662 depends on. Lưu ý rằng tùy chọn dài dòng cho trình thông dịch Python,
GFG
664, cung cấp thông tin tương tự và nhiều, nhiều hơn nữa

For another example, say that you’re on a quest to rid the world of regular expressions. (Now, why would you want such a thing? Regular expressions are great. ) You could implement the following finder that bans the

GFG
665 regular expressions module

GFG
70

Raising a

GFG
683 ensures that no finder later in the list of finders will be executed. This effectively stops you from using regular expressions in Python

>>>

GFG
71

Even though you’re importing only

GFG
662, that module is importing
GFG
665 behind the scenes, so an error is raised

Example. Automatically Install From PyPI

Vì hệ thống nhập của Python đã khá mạnh mẽ và hữu ích, nên có nhiều cách để làm rối tung nó hơn là mở rộng nó theo cách hữu ích. However, the following example can be useful in certain situations

The Python Package Index (PyPI) is your one-stop cheese shop for finding third-party modules and packages. It’s also the place from which

GFG
655 downloads packages

In other Real Python tutorials, you may have seen instructions to use

GFG
670 to install the third-party modules and packages you need for following along with examples. Wouldn’t it be great to have Python automatically install missing modules for you?

Warning. In most cases, it really wouldn’t be great to have Python install modules automatically. Chẳng hạn, trong hầu hết các cài đặt sản xuất, bạn muốn kiểm soát môi trường của mình. Furthermore, the documentation cautions against using

GFG
655 this way

To avoid messing up your Python installation, you should play with this code only in environments that you wouldn’t mind deleting or reinstalling

The following finder attempts to install modules using

GFG
655

GFG
72

So với các công cụ tìm bạn đã thấy trước đó, công cụ này phức tạp hơn một chút. By putting this finder last in the list of finders, you know that if you call

GFG
673, then the module won’t be found on your system. Do đó, công việc của
GFG
651 chỉ là thực hiện
GFG
675. If the installation works, then the module spec will be created and returned

Try to use the

GFG
676 library without installing it yourself

>>>

GFG
73

Thông thường,

GFG
677 sẽ tăng một
GFG
683, nhưng trong trường hợp này,
GFG
676 được cài đặt và nhập

While the

GFG
673 seemingly works, there are some challenges with this approach. Một vấn đề lớn là tên nhập của một mô-đun không phải lúc nào cũng tương ứng với tên của nó trên PyPI. Ví dụ: trình đọc nguồn cấp dữ liệu Real Python có tên là
GFG
681 trên PyPI, nhưng tên nhập chỉ đơn giản là
GFG
682

Sử dụng

GFG
673 để nhập và cài đặt
GFG
682 kết thúc bằng việc cài đặt sai gói

>>>

GFG
74

Điều này có thể gây hậu quả tai hại cho dự án của bạn

One situation in which automatic installations can be quite helpful is when you’re running Python in the cloud with more limited control over your environment, such as when you’re running Jupyter-style notebooks at Google Colaboratory. The Colab notebook environment is great for doing cooperative data exploration

Một sổ ghi chép điển hình đi kèm với nhiều gói khoa học dữ liệu được cài đặt, bao gồm NumPy, Pandas và Matplotlib và bạn có thể thêm các gói mới bằng

GFG
655. Nhưng bạn cũng có thể kích hoạt cài đặt tự động

Làm cách nào để nhập tệp bằng Python?

GFG
686 không có sẵn cục bộ trên máy chủ Colab nên mã này được sao chép vào ô đầu tiên của sổ ghi chép

Thí dụ. Nhập tệp dữ liệu

The final example in this section is inspired by Aleksey Bilogur’s great blog post Import Almost Anything in Python. An Intro to Module Loaders and Finders. You’ve already seen how to use

GFG
917 to import datafiles. Tại đây, thay vào đó, bạn sẽ triển khai trình tải tùy chỉnh có thể nhập trực tiếp tệp CSV

Trước đó, bạn đã làm việc với một tệp CSV khổng lồ chứa dữ liệu dân số. Để làm cho ví dụ về trình tải tùy chỉnh dễ quản lý hơn, hãy xem xét tệp

GFG
688 nhỏ hơn sau đây

GFG
75

Dòng đầu tiên là tiêu đề đặt tên cho ba trường và hai hàng dữ liệu tiếp theo, mỗi hàng chứa thông tin về một nhân viên. For more information about working with CSV files, check out Reading and Writing CSV Files in Python

Your goal in this section is to write a finder and a loader that allow you to import the CSV file directly so that you can write code like the following

>>>

GFG
76

The job of the finder will be to search for and recognize CSV files. Công việc của trình tải sẽ là nhập dữ liệu CSV. Often, you can implement finders and corresponding loaders in one common class. Đó là cách tiếp cận bạn sẽ thực hiện ở đây

GFG
77

There’s quite a bit of code in this example. May mắn thay, hầu hết công việc được thực hiện trong

GFG
651 và
GFG
690. Hãy xem xét chúng chi tiết hơn

Như bạn đã thấy trước đó,

GFG
651 chịu trách nhiệm tìm mô-đun. Trong trường hợp này, bạn đang tìm tệp CSV, vì vậy bạn tạo tên tệp có hậu tố
GFG
692.
GFG
659 contains the full name of the module that is imported. Ví dụ: nếu bạn sử dụng
GFG
694, thì
GFG
659 sẽ là
GFG
696. Trong trường hợp này, tên tệp sẽ là
GFG
688

For top-level imports,

GFG
698 will be
GFG
653. In that case, you look for the CSV file in the full import path, which will include the current working directory. Nếu bạn đang nhập tệp CSV trong một gói, thì
GFG
698 sẽ được đặt thành đường dẫn hoặc nhiều đường dẫn của gói. Nếu bạn tìm thấy tệp CSV phù hợp, thì thông số mô-đun sẽ được trả về. This module spec tells Python to load the module using
GFG
801

Dữ liệu CSV được tải bởi

GFG
690. Bạn có thể sử dụng
GFG
803 từ thư viện chuẩn để thực hiện phân tích cú pháp tệp thực tế. Giống như hầu hết mọi thứ trong Python, các mô-đun được hỗ trợ bởi từ điển. Bằng cách thêm dữ liệu CSV vào
GFG
804, bạn cung cấp dữ liệu đó dưới dạng thuộc tính của mô-đun

Chẳng hạn, thêm

GFG
805 vào từ điển mô-đun ở dòng 44 cho phép bạn liệt kê các tên trường trong tệp CSV như sau

>>>

GFG
78

In general, CSV field names can contain spaces and other characters that aren’t allowed in Python attribute names. Before adding the fields as attributes on the module, you sanitize the field names using a regular expression. This is done in

GFG
806 starting on line 51

You can see an example of this effect in the

GFG
807 field name above. Nếu xem tệp CSV gốc, thì bạn sẽ thấy tiêu đề có nội dung
GFG
808 với dấu cách thay vì dấu gạch dưới

Bằng cách kết nối

GFG
801 này vào hệ thống nhập Python, bạn sẽ nhận được khá nhiều chức năng miễn phí. Ví dụ: bộ đệm mô-đun sẽ đảm bảo rằng tệp dữ liệu chỉ được tải một lần

Mẹo và thủ thuật nhập khẩu

To round out this tutorial, you’ll see a few tips about how to handle certain situations that come up from time to time. Bạn sẽ thấy cách xử lý các gói bị thiếu, nhập theo chu kỳ và thậm chí cả các gói được lưu trữ bên trong tệp ZIP

Handle Packages Across Python Versions

Sometimes you need to deal with packages that have different names depending on the Python version. You’ve already seen one example of this.

GFG
917 has only been available since Python 3. 7. In earlier versions of Python, you need to install and use
GFG
921 instead

As long as the different versions of the package are compatible, you can handle this by renaming the package with

GFG
812

GFG
65

In the rest of the code, you can refer to

GFG
813 and not worry about whether you’re using
GFG
917 or
GFG
921

Normally, it’s easiest to use a

GFG
653 statement to figure out which version to use. Một tùy chọn khác là kiểm tra phiên bản của trình thông dịch Python. However, this may add some maintenance cost if you need to update the version numbers

You could rewrite the previous example as follows

GFG
500

This would use

GFG
917 on Python 3. 7 trở lên trong khi quay lại
GFG
921 trên các phiên bản Python cũ hơn. Xem dự án
GFG
819 để có lời khuyên hữu ích và phù hợp với tương lai về cách kiểm tra phiên bản Python nào đang chạy

Handle Missing Packages. Use an Alternative

The following use case is closely related to the previous example. Assume there’s a compatible reimplementation of a package. The reimplementation is better optimized, so you want to use it if it’s available. Tuy nhiên, gói ban đầu có sẵn dễ dàng hơn và cũng mang lại hiệu suất chấp nhận được

Một ví dụ như vậy là

GFG
820, đây là phiên bản được tối ưu hóa của
GFG
821 từ thư viện chuẩn. You can handle these preferences the same way you handled different package names earlier

GFG
501

Điều này sẽ sử dụng

GFG
820 nếu nó có sẵn và quay trở lại
GFG
821 nếu không

Một ví dụ tương tự khác là gói UltraJSON, một bộ mã hóa và giải mã JSON cực nhanh có thể được sử dụng để thay thế cho

GFG
696 trong thư viện chuẩn

GFG
502

Bằng cách đổi tên

GFG
825 thành
GFG
696, bạn không phải lo lắng về gói hàng nào thực sự được nhập khẩu

Handle Missing Packages. Sử dụng Mock thay thế

Ví dụ thứ ba, có liên quan là thêm một gói cung cấp một tính năng tuyệt vời không thực sự cần thiết cho ứng dụng của bạn. Again, this can be solved by adding

GFG
653 to your imports. The extra challenge is how you will replace the optional package if it’s not available

For a concrete example, say that you’re using Colorama to add colored text in the console. Colorama mainly consists of special string constants that add color when printed

>>>

GFG
503

Thật không may, màu sắc không hiển thị trong ví dụ trên. Trong thiết bị đầu cuối của bạn, nó sẽ trông giống như thế này

Làm cách nào để nhập tệp bằng Python?

Before you start using Colorama colors, you should call

GFG
828. Đặt
GFG
829 thành
GFG
830 có nghĩa là các chỉ thị màu sẽ tự động được đặt lại ở cuối chuỗi. Đó là một cài đặt hữu ích nếu bạn chỉ muốn tô màu một dòng tại một thời điểm

If you’d rather have all your output be (for example) blue, then you can let

GFG
829 be
GFG
832 and add
GFG
833 to the beginning of your script. The following colors are available

>>>

GFG
504

You can also use

GFG
834 to control the style of your text. Bạn có thể chọn giữa
GFG
835,
GFG
836 và
GFG
837

Cuối cùng,

GFG
838 cung cấp mã để kiểm soát vị trí của con trỏ. Bạn có thể sử dụng nó để hiển thị tiến trình hoặc trạng thái của tập lệnh đang chạy. Ví dụ sau hiển thị đếm ngược từ
GFG
839

GFG
505

Lưu ý cách bộ đếm giữ nguyên vị trí thay vì in trên các dòng riêng biệt như bình thường

Làm cách nào để nhập tệp bằng Python?

Let’s get back to the task at hand. For many applications, adding color to your console output is cool but not critical. Để tránh thêm một phần phụ thuộc khác vào ứng dụng của mình, bạn chỉ muốn sử dụng Colorama nếu ứng dụng này có sẵn trên hệ thống và không làm hỏng ứng dụng nếu ứng dụng không có

Để làm điều này, bạn có thể lấy cảm hứng từ thử nghiệm và việc sử dụng mô phỏng. Một mô hình có thể thay thế cho một đối tượng khác đồng thời cho phép bạn kiểm soát hành vi của nó. Đây là một nỗ lực ngây thơ để chế giễu Colorama

>>>

GFG
506

Điều này không thực sự hiệu quả, vì

GFG
840 được biểu thị bằng một chuỗi làm rối đầu ra của bạn. Instead, you want to create an object that always renders as the empty string

It’s possible to change the return value of

GFG
677 on
GFG
842 objects. Tuy nhiên, trong trường hợp này, sẽ thuận tiện hơn nếu bạn viết bản mô phỏng của riêng mình

GFG
507

GFG
843 is an empty string that will also return the empty string when it’s called. Điều này giúp chúng tôi triển khai lại Colorama một cách hiệu quả, chỉ cần không có màu sắc

The final trick is that

GFG
844 returns itself, so that all colors, styles, and cursor movements that are attributes on
GFG
845,
GFG
846,
GFG
847, and
GFG
848 are mocked as well

The

GFG
849 module is designed to be a drop-in replacement for Colorama, so you can update the countdown example using search and replace

GFG
508

Nếu bạn chạy tập lệnh này trên hệ thống không có Colorama thì tập lệnh vẫn hoạt động nhưng có thể trông không đẹp bằng

Làm cách nào để nhập tệp bằng Python?

Khi cài đặt Colorama, bạn sẽ thấy kết quả giống như trước đó

Import Scripts as Modules

Một điểm khác biệt giữa tập lệnh và mô-đun thư viện là tập lệnh thường làm một việc gì đó, trong khi thư viện cung cấp chức năng. Both scripts and libraries live inside regular Python files, and as far as Python is concerned, there’s no difference between them

Thay vào đó, sự khác biệt là ở chỗ tệp được sử dụng như thế nào. nó nên được thực thi với

GFG
850 hay được nhập với
GFG
851 bên trong một tập lệnh khác?

Sometimes you’ll have a module that works as both a script and a library. You could try to refactor your module into two different files

One example of this in the standard library is the

GFG
696 package. You usually use it as a library, but it also comes bundled with a script that can prettify JSON files. Assume you have the following
GFG
853 file

GFG
509

As JSON is often read only by machines, many JSON files aren’t formatted in a readable fashion. In fact, it’s quite common for JSON files to consist of one very long line of text

GFG
854 is a script that uses the
GFG
696 library to format JSON in a more readable fashion

GFG
510

Now the structure of the JSON file becomes much less complicated to grasp. Bạn có thể sử dụng tùy chọn

GFG
856 để sắp xếp các khóa theo thứ tự bảng chữ cái

While it’s good practice to split scripts and libraries, Python has an idiom that makes it possible to treat a module as both a script and a library at the same time. As noted earlier, the value of the special

GFG
625 module variable is set at runtime based on whether the module is imported or run as a script

Let’s test it out. Create the following file

GFG
511

Nếu bạn chạy tệp này, thì bạn sẽ thấy rằng

GFG
625 được đặt thành giá trị đặc biệt
GFG
626

GFG
512

Tuy nhiên, nếu bạn nhập mô-đun, thì

GFG
625 được đặt thành tên của mô-đun

>>>

GFG
513

Hành vi này được tận dụng trong mẫu sau

GFG
514

Let’s use this in a bigger example. Với nỗ lực giúp bạn luôn trẻ trung, tập lệnh sau sẽ thay thế bất kỳ độ tuổi “già” nào (

GFG
861 trở lên) bằng
GFG
629

GFG
515

You can run this as a script, and it will interactively make the age you type younger

GFG
516

Bạn cũng có thể sử dụng mô-đun làm thư viện có thể nhập. The

GFG
624 test on line 12 makes sure that there are no side effects when you import the library. Only the functions
GFG
864 and
GFG
865 are defined. You can, for instance, use this library as follows

>>>

GFG
517

Without the protection of the

GFG
624 test, the import would have triggered the interactive
GFG
867 and made
GFG
868 very hard to use as a library

Run Python Scripts From ZIP Files

A slightly obscure feature of Python is that it can run scripts packaged into ZIP files. Ưu điểm chính của điều này là bạn có thể phân phối một gói đầy đủ dưới dạng một tệp

Note, however, that this still requires Python to be installed on the system. If you want to distribute your Python application as a stand-alone executable file, then see Using PyInstaller to Easily Distribute Python Applications

If you give the Python interpreter a ZIP file, then it’ll look for a file named

GFG
955 inside the ZIP archive, extract it, and run it. As a basic example, create the following
GFG
955 file

GFG
518

Điều này sẽ in một tin nhắn khi bạn chạy nó

GFG
519

Now add it to a ZIP archive. You may be able to do this on the command line

GFG
520

Trên Windows, thay vào đó, bạn có thể sử dụng trỏ và nhấp. Chọn tệp trong File Explorer, sau đó nhấp chuột phải và chọn Gửi đến → thư mục đã nén (zipped)

Since

GFG
626 isn’t a very descriptive name, you named the ZIP file
GFG
872. Bây giờ bạn có thể gọi nó trực tiếp bằng Python

GFG
521

Lưu ý rằng tập lệnh của bạn biết rằng nó nằm bên trong

GFG
872. Furthermore, the root of your ZIP file is added to Python’s import path so that your scripts can import other modules inside the same ZIP file

Think back to the earlier example in which you created a quiz based on population data. Có thể phân phối toàn bộ ứng dụng này dưới dạng một tệp ZIP.

GFG
917 sẽ đảm bảo tệp dữ liệu được trích xuất từ ​​kho lưu trữ ZIP khi cần

The app consists of the following files

GFG
522

You could add these to a ZIP file in the same way you did above. However, Python comes with a tool called

GFG
875 that streamlines the process of packing applications into ZIP archives. You use it as follows

GFG
523

This command essentially does two things. nó tạo ra một điểm vào và đóng gói ứng dụng của bạn

Remember that you needed a

GFG
955 file as an entry point inside your ZIP archive. If you supply the
GFG
958 option with information about how your app should be started, then
GFG
875 creates this file for you. Trong ví dụ này,
GFG
955 được tạo trông như thế này

GFG
524

GFG
955 này được đóng gói, cùng với nội dung của thư mục
GFG
881, vào một kho lưu trữ ZIP có tên là
GFG
882. Hậu tố
GFG
883 báo hiệu rằng đây là tệp Python được gói trong kho lưu trữ ZIP

Ghi chú. By default,

GFG
875 doesn’t compress any files. Nó chỉ đóng gói chúng thành một tệp duy nhất. You can tell
GFG
875 to compress the files as well by adding the
GFG
886 option

However, this feature is available only in Python 3. 7 trở lên. See the

GFG
875 documentation for more information

On Windows,

GFG
883 files should already be registered as Python files. On Mac and Linux, you can have
GFG
875 create executable files by using the
GFG
890 interpreter option and specifying which interpreter to use

GFG
525

The

GFG
890 option adds a shebang (
GFG
892) that tells the operating system how to run the file. Additionally, it makes the
GFG
883 file executable so that you can run the file just by typing its name

GFG
526

Lưu ý

GFG
894 trước tên tệp. This is a typical trick on Mac and Linux to run executable files in the current directory. Nếu bạn di chuyển tệp vào một thư mục trên
GFG
895 của mình hoặc nếu bạn đang sử dụng Windows thì bạn chỉ có thể sử dụng tên tệp.
GFG
882

Note. Trên Python 3. 6 trở lên, lệnh trước đó sẽ thất bại với thông báo nói rằng nó không thể tìm thấy tài nguyên dữ liệu dân số trong thư mục

GFG
937. Điều này là do một giới hạn trong
GFG
898

Một cách giải quyết khác là cung cấp đường dẫn tuyệt đối tới

GFG
882. On Mac and Linux, you can do this with the following trick

GFG
527

Lệnh

GFG
800 mở rộng đến đường dẫn của thư mục hiện tại

Let’s close this section by looking at a nice effect of using

GFG
917. Hãy nhớ rằng bạn đã sử dụng đoạn mã sau để mở tệp dữ liệu

GFG
528

Một cách phổ biến hơn để mở tệp dữ liệu là xác định vị trí của chúng dựa trên thuộc tính

GFG
913 của mô-đun của bạn

GFG
529

This approach usually works well. However, it falls apart when your application is packed into a ZIP file

GFG
530

Tệp dữ liệu của bạn nằm trong kho lưu trữ ZIP nên

GFG
930 không thể mở tệp đó.
GFG
917, on the other hand, will extract your data to a temporary file before opening it

Handle Cyclical Imports

Nhập theo chu kỳ xảy ra khi bạn có hai hoặc nhiều mô-đun nhập lẫn nhau. Cụ thể hơn, hãy tưởng tượng rằng mô-đun

GFG
805 sử dụng
GFG
806 và mô-đun
GFG
807 nhập khẩu tương tự
GFG
805

Làm cách nào để nhập tệp bằng Python?

Python’s import system is to some extent designed to handle import cycles. For instance, the following code—while not very useful—runs fine

GFG
531

Cố gắng nhập

GFG
805 trong trình thông dịch tương tác cũng nhập
GFG
807

>>>

GFG
532

Note that

GFG
807 is imported in the middle of the import of
GFG
805, precisely at the
GFG
806 statement in the source code of
GFG
805. Lý do điều này không kết thúc trong đệ quy vô tận là người bạn cũ của chúng tôi bộ đệm mô-đun

Khi bạn nhập

GFG
815, một tham chiếu đến
GFG
805 sẽ được thêm vào bộ nhớ cache của mô-đun ngay cả trước khi tải
GFG
805. When
GFG
807 tries to import
GFG
805 later, it simply uses the reference in the module cache

Bạn cũng có thể có các mô-đun làm điều gì đó hữu ích hơn một chút. Nếu bạn xác định các thuộc tính và chức năng trong các mô-đun của mình, thì tất cả vẫn hoạt động

GFG
533

Importing

GFG
805 works the same as before

>>>

GFG
532

Các sự cố liên quan đến nhập đệ quy bắt đầu xuất hiện khi bạn thực sự sử dụng mô-đun khác tại thời điểm nhập thay vì chỉ xác định các hàm sẽ sử dụng mô-đun khác sau này. Add one line to

GFG
821

GFG
535

Now Python gets confused by the import

>>>

GFG
536

Thông báo lỗi lúc đầu có vẻ hơi khó hiểu. Nhìn lại mã nguồn, bạn có thể xác nhận rằng

GFG
630 được định nghĩa trong mô-đun
GFG
805

The problem is that

GFG
630 isn’t defined in
GFG
805 at the time
GFG
807 gets imported. Consequently,
GFG
827 is used by the call to
GFG
828

To add to the confusion, you’ll have no issues importing

GFG
807

>>>

GFG
537

Vào thời điểm

GFG
807 gọi
GFG
828,
GFG
805 được nhập hoàn toàn và
GFG
827 được xác định rõ. Cuối cùng, do bộ đệm mô-đun mà bạn đã thấy trước đó,
GFG
815 có thể hoạt động nếu bạn thực hiện một số thao tác nhập khác trước

>>>

GFG
538

Vậy làm thế nào bạn có thể tránh bị sa lầy và bối rối bởi việc nhập khẩu theo chu kỳ?

Thông thường, thời gian dễ dàng nhất để khắc phục các lần nhập theo chu kỳ là trước khi bạn triển khai chúng. Nếu bạn thấy các chu kỳ trong bản phác thảo kiến ​​trúc của mình, hãy xem xét kỹ hơn và cố gắng phá vỡ các chu kỳ đó

Still, there are times when it’s reasonable to introduce an import cycle. As you saw above, this isn’t a problem so long as your modules define only attributes, functions, classes, and so on. The second tip—which is also good design practice—is to keep your modules free of side effects at import time

Nếu bạn thực sự cần các mô-đun có chu kỳ nhập và tác dụng phụ, thì vẫn còn một cách khác. thực hiện nhập cục bộ của bạn bên trong các chức năng

Note that in the following code,

GFG
806 is done inside
GFG
828. Điều này có hai hậu quả. Đầu tiên,
GFG
807 chỉ khả dụng bên trong hàm
GFG
828. Quan trọng hơn, quá trình nhập không diễn ra cho đến khi bạn gọi
GFG
828 sau khi
GFG
805 đã được nhập đầy đủ

GFG
539

Now there are no issues importing and using

GFG
805

>>>

GFG
540

Notice that

GFG
807 is, in fact, not imported until you call
GFG
828. Để có một góc nhìn khác về nhập khẩu theo chu kỳ, hãy xem ghi chú kinh điển của Fredrik Lundh

Nhập hồ sơ

One concern when importing several modules and packages is that it will add to the startup time of your script. Tùy thuộc vào ứng dụng của bạn, điều này có thể hoặc không quan trọng

Kể từ khi phát hành Python 3. 7, bạn đã có một cách nhanh chóng để biết cần bao nhiêu thời gian để nhập các gói và mô-đun. Trăn 3. 7 supports the

GFG
844 command-line option, which measures and prints how much time each module takes to import

GFG
541

Cột

GFG
845 hiển thị thời gian nhập tích lũy (tính bằng micrô giây) trên cơ sở từng gói. Bạn có thể đọc danh sách như sau. Python đã dành
GFG
846 micro giây để nhập đầy đủ
GFG
847, bao gồm cả việc nhập
GFG
638,
GFG
549 và triển khai C
GFG
850

The

GFG
851 column shows the time it took to import only the given module, excluding any recursive imports. Bạn có thể thấy rằng
GFG
638 mất
GFG
853 micro giây để nhập,
GFG
549 mất
GFG
855,
GFG
850 mất
GFG
857 và bản thân việc nhập
GFG
847 mất
GFG
859 micro giây. All in all, this adds up to a cumulative time of
GFG
846 microseconds (within rounding errors)

Have a look at the

GFG
861 example from the Colorama section

GFG
542

In this example, importing

GFG
849 took almost 0. 013 seconds. Hầu hết thời gian đó được dành để nhập Colorama và các phụ thuộc của nó. The
GFG
851 column shows the import time excluding nested imports

Đối với một ví dụ cực đoan, hãy xem xét đơn lẻ

GFG
624 từ trước đó. Because it’s loading a big data file, it’s extremely slow to import. To test this, you can run
GFG
865 as a script with the
GFG
886 option

GFG
543

Trong trường hợp này, mất gần 2 giây để nhập

GFG
624, trong đó khoảng 1. 6 seconds are spent in the module itself, mainly for loading the data file

GFG
844 là một công cụ tuyệt vời để tối ưu hóa quá trình nhập của bạn. If you need to do more general monitoring and optimization of your code, then check out Python Timer Functions. Three Ways to Monitor Your Code

Conclusion

Trong hướng dẫn này, bạn đã biết hệ thống nhập Python. Like many things in Python, it’s fairly straightforward to use for basic tasks like importing modules and packages. Đồng thời, hệ thống nhập khẩu khá phức tạp, linh hoạt và có thể mở rộng. You’ve learned several import-related tricks that you can take advantage of in your own code

In this tutorial, you’ve learned how to

  • Create namespace packages
  • Nhập tài nguyên và tệp dữ liệu
  • Decide what to import dynamically at runtime
  • Mở rộng hệ thống nhập của Python
  • Xử lý các phiên bản khác nhau của gói

Throughout the tutorial, you’ve seen many links to further info. Nguồn có thẩm quyền nhất trên hệ thống nhập Python là tài liệu chính thức

  • The import system
  • Gói
    GFG
    969
  • PEP 420. Gói không gian tên ẩn
  • Importing modules

Bạn có thể sử dụng kiến ​​thức về nhập Python của mình bằng cách làm theo các ví dụ trong hướng dẫn này. Click the link below for access to the source code

Get the Source Code. Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụng để tìm hiểu về hệ thống nhập Python trong hướng dẫn này

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. No spam ever. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Làm cách nào để nhập tệp bằng Python?

Gửi cho tôi thủ thuật Python »

Giới thiệu về Geir Arne Hjelle

Làm cách nào để nhập tệp bằng Python?
Làm cách nào để nhập tệp bằng Python?

Geir Arne là một Pythonista cuồng nhiệt và là thành viên của nhóm hướng dẫn Real Python

» Thông tin thêm về Geir Arne


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. The team members who worked on this tutorial are

Làm cách nào để nhập tệp bằng Python?

Aldren

Làm cách nào để nhập tệp bằng Python?

Brad

Làm cách nào để nhập tệp bằng Python?

Dan

Làm cách nào để nhập tệp bằng Python?

Joanna

Làm cách nào để nhập tệp bằng Python?

Gia-cốp

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Làm cách nào để nhập tệp bằng Python?

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Join us and get access to thousands of tutorials, hands-on video courses, and a community of expert Pythonistas

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Share Share Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. The most useful comments are those written with the goal of learning from or helping out other students. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi

Bạn có thể nhập tệp vào Python không?

Python modules can get access to code from another module by importing the file/function using import .

Làm cách nào để nhập tệp hoạt động trong Python?

Khi một gói được nhập, Python sẽ chạy tất cả mã trong __init__ của gói. py, nếu có một tệp như vậy . Tất cả các đối tượng được xác định trong mô-đun hoặc gói __init__. py được cung cấp cho nhà nhập khẩu.