Nhập tệp Python từ cùng thư mục

Nếu bạn đã từng làm việc trên một dự án Python có nhiều tệp, rất có thể bạn đã phải sử dụng câu lệnh nhập trước đây

Ngay cả đối với Pythonistas với một vài dự án trong vành đai của họ, việc nhập khẩu có thể gây nhầm lẫn. Có thể bạn đang đọc bài này vì bạn muốn hiểu sâu hơn về nhập khẩu trong Python, đặc biệt là nhập khẩu tuyệt đối và tương đối

Trong hướng dẫn này, bạn sẽ tìm hiểu sự khác biệt giữa hai loại này, cũng như ưu và nhược điểm của chúng. Hãy đi sâu vào ngay

Tiền thưởng miễn phí. 5 Suy nghĩ về Làm chủ Python, một khóa học miễn phí dành cho các nhà phát triển Python cho bạn thấy lộ trình và tư duy mà bạn sẽ cần để đưa các kỹ năng Python của mình lên một tầm cao mới

Tóm tắt nhanh về nhập khẩu

Bạn cần hiểu rõ về các mô-đun và gói Python để biết cách nhập hoạt động. Mô-đun Python là một tệp có phần mở rộng

import abc
3 và gói Python là bất kỳ thư mục nào có các mô-đun bên trong nó (hoặc, trong Python 2, một thư mục chứa tệp
import abc
4)

Điều gì xảy ra khi bạn có mã trong một mô-đun cần truy cập mã trong mô-đun hoặc gói khác?

Loại bỏ các quảng cáo

Nhập khẩu hoạt động như thế nào

Nhưng chính xác thì nhập khẩu hoạt động như thế nào?

import abc

Điều đầu tiên Python sẽ làm là tra cứu tên

import abc
5 trong. Đây là bộ đệm của tất cả các mô-đun đã được nhập trước đó

Nếu tên không được tìm thấy trong bộ đệm mô-đun, Python sẽ tiến hành tìm kiếm thông qua danh sách các mô-đun tích hợp. Đây là những mô-đun được cài đặt sẵn với Python và có thể tìm thấy trong Thư viện chuẩn Python. Nếu tên vẫn không được tìm thấy trong các mô-đun tích hợp, thì Python sẽ tìm kiếm nó trong danh sách các thư mục được xác định bởi. Danh sách này thường bao gồm thư mục hiện tại, được tìm kiếm đầu tiên

Khi Python tìm thấy mô-đun, nó sẽ liên kết nó với một tên trong phạm vi cục bộ. Điều này có nghĩa là

import abc
5 hiện đã được xác định và có thể được sử dụng trong tệp hiện tại mà không cần ném
from abc import xyz
0

Nếu tên không bao giờ được tìm thấy, bạn sẽ nhận được một

from abc import xyz
1. Bạn có thể tìm hiểu thêm về nhập trong tài liệu Python tại đây

Ghi chú. Mối quan tâm về an ninh

Xin lưu ý rằng hệ thống nhập của Python có một số rủi ro bảo mật đáng kể. Điều này phần lớn là do tính linh hoạt của nó. Ví dụ: bộ đệm mô-đun có thể ghi được và có thể ghi đè chức năng Python cốt lõi bằng hệ thống nhập. Việc nhập từ các gói của bên thứ ba cũng có thể khiến ứng dụng của bạn gặp phải các mối đe dọa bảo mật

Dưới đây là một số tài nguyên thú vị để tìm hiểu thêm về những lo ngại về bảo mật này và cách giảm thiểu chúng

  • 10 vấn đề bảo mật phổ biến trong Python và cách tránh chúng bởi Anthony Shaw (Điểm 5 nói về hệ thống nhập của Python. )
  • Tập #168. 10 lỗ hổng bảo mật Python và cách khắc phục chúng từ podcast TalkPython (Các thành viên tham gia hội thảo bắt đầu nói về việc nhập khẩu vào khoảng ngày 27. 15 điểm. )

Cú pháp báo cáo nhập khẩu

Bây giờ bạn đã biết cách hoạt động của câu lệnh nhập, hãy khám phá cú pháp của chúng. Bạn có thể nhập cả gói và mô-đun. (Lưu ý rằng việc nhập gói về cơ bản sẽ nhập tệp

import abc
4 của gói dưới dạng mô-đun. ) Bạn cũng có thể nhập các đối tượng cụ thể từ gói hoặc mô-đun

Nói chung có hai loại cú pháp nhập khẩu. Khi bạn sử dụng cái đầu tiên, bạn nhập tài nguyên trực tiếp, như thế này

import abc

import abc
5 có thể là một gói hoặc một mô-đun

Khi bạn sử dụng cú pháp thứ hai, bạn nhập tài nguyên từ gói hoặc mô-đun khác. Đây là một ví dụ

from abc import xyz

from abc import xyz
4 có thể là một mô-đun, gói con hoặc đối tượng, chẳng hạn như một lớp hoặc hàm

Bạn cũng có thể chọn đổi tên tài nguyên đã nhập, như vậy

import abc as other_name

Điều này đổi tên tài nguyên đã nhập

import abc
5 thành
from abc import xyz
6 trong tập lệnh. Bây giờ nó phải được tham chiếu là
from abc import xyz
6, nếu không nó sẽ không được công nhận

Kiểu dáng của báo cáo nhập khẩu

, hướng dẫn phong cách chính thức cho Python, có một số gợi ý khi viết câu lệnh nhập. Đây là một bản tóm tắt

  1. Nội dung nhập phải luôn được ghi ở đầu tệp, sau bất kỳ nhận xét và mô-đun nào.

  2. Nhập khẩu nên được chia theo những gì đang được nhập khẩu. Nhìn chung có ba nhóm

    • nhập thư viện tiêu chuẩn (các mô-đun tích hợp sẵn của Python)
    • nhập khẩu của bên thứ ba có liên quan (các mô-đun được cài đặt và không thuộc về ứng dụng hiện tại)
    • nhập ứng dụng cục bộ (các mô-đun thuộc về ứng dụng hiện tại)
  3. Mỗi nhóm nhập khẩu phải được phân tách bằng khoảng trống

Bạn cũng nên sắp xếp hàng nhập của mình theo thứ tự bảng chữ cái trong mỗi nhóm nhập. Điều này làm cho việc tìm kiếm các mục nhập cụ thể dễ dàng hơn nhiều, đặc biệt là khi có nhiều mục nhập trong một tệp

Đây là một ví dụ về cách định kiểu câu lệnh nhập

"""Illustration of good import statement styling.

Note that the imports come after the docstring.

"""

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function

Các câu lệnh nhập ở trên được chia thành ba nhóm riêng biệt, được phân tách bằng khoảng trống. Chúng cũng được sắp xếp theo thứ tự bảng chữ cái trong mỗi nhóm

Loại bỏ các quảng cáo

nhập khẩu tuyệt đối

Bạn đã bắt kịp tốc độ viết câu lệnh nhập và cách tạo kiểu cho chúng như một người chuyên nghiệp. Bây giờ là lúc để tìm hiểu thêm một chút về nhập khẩu tuyệt đối

Nhập tuyệt đối chỉ định tài nguyên sẽ được nhập bằng đường dẫn đầy đủ của nó từ thư mục gốc của dự án

Cú pháp và ví dụ thực tế

Giả sử bạn có cấu trúc thư mục sau

└── project
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py

Có một thư mục,

from abc import xyz
8, chứa hai thư mục con,
from abc import xyz
9 và
import abc as other_name
0. Thư mục
from abc import xyz
9 có hai tệp,
import abc as other_name
2 và
import abc as other_name
3

Thư mục

import abc as other_name
0 có ba tệp. hai mô-đun,
import abc as other_name
5 và
import abc as other_name
6, và một tệp khởi tạo,
import abc
4. Nó cũng chứa một thư mục,
import abc as other_name
8, đến lượt thư mục này lại chứa một tệp,
import abc as other_name
9

Hãy giả sử như sau

  1. """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    0 chứa hàm,
    """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    1
  2. """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    2 chứa một lớp,
    """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    3
  3. """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    4 chứa hàm,
    """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    5

Sau đây là những ví dụ thực tế về nhập khẩu tuyệt đối

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

Lưu ý rằng bạn phải cung cấp đường dẫn chi tiết cho từng gói hoặc tệp, từ thư mục gói cấp cao nhất. Điều này hơi giống với đường dẫn tệp của nó, nhưng chúng tôi sử dụng dấu chấm (

"""Illustration of good import statement styling.

Note that the imports come after the docstring.

"""

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function
6) thay vì dấu gạch chéo (
"""Illustration of good import statement styling.

Note that the imports come after the docstring.

"""

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function
7)

Ưu và nhược điểm của nhập khẩu tuyệt đối

Nhập khẩu tuyệt đối được ưa thích hơn vì chúng khá rõ ràng và đơn giản. Thật dễ dàng để biết chính xác tài nguyên đã nhập ở đâu, chỉ bằng cách nhìn vào câu lệnh. Ngoài ra, nhập tuyệt đối vẫn hợp lệ ngay cả khi vị trí hiện tại của câu lệnh nhập thay đổi. Trên thực tế, PEP 8 khuyến nghị rõ ràng việc nhập khẩu tuyệt đối

Tuy nhiên, đôi khi, việc nhập tuyệt đối có thể khá dài dòng, tùy thuộc vào độ phức tạp của cấu trúc thư mục. Hãy tưởng tượng có một tuyên bố như thế này

from package1.subpackage2.subpackage3.subpackage4.module5 import function6

Điều đó thật lố bịch, phải không?

Nhập khẩu tương đối

Nhập tương đối chỉ định tài nguyên được nhập tương ứng với vị trí hiện tại—nghĩa là vị trí có câu lệnh nhập. Có hai loại nhập khẩu tương đối. ngầm định và rõ ràng. Nhập ẩn tương đối không được dùng trong Python 3, vì vậy tôi sẽ không đề cập đến chúng ở đây

Loại bỏ các quảng cáo

Cú pháp và ví dụ thực tế

Cú pháp của một lần nhập tương đối phụ thuộc vào vị trí hiện tại cũng như vị trí của mô-đun, gói hoặc đối tượng được nhập. Dưới đây là một vài ví dụ về nhập khẩu tương đối

from .some_module import some_class
from ..some_package import some_function
from . import some_class

Bạn có thể thấy rằng có ít nhất một dấu chấm trong mỗi câu lệnh nhập ở trên. Nhập khẩu tương đối sử dụng ký hiệu dấu chấm để chỉ định vị trí

Một dấu chấm đơn có nghĩa là mô-đun hoặc gói được tham chiếu nằm trong cùng thư mục với vị trí hiện tại. Hai dấu chấm có nghĩa là nó nằm trong thư mục mẹ của vị trí hiện tại—tức là thư mục ở trên. Ba dấu chấm có nghĩa là nó nằm trong thư mục ông bà, v.v. Điều này có thể sẽ quen thuộc với bạn nếu bạn sử dụng hệ điều hành giống Unix

Giả sử bạn có cùng cấu trúc thư mục như trước

└── project
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py

Nhớ lại nội dung tập tin

  1. """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    0 chứa hàm,
    """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    1
  2. """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    2 chứa một lớp,
    """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    3
  3. """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    4 chứa hàm,
    """Illustration of good import statement styling.
    
    Note that the imports come after the docstring.
    
    """
    
    # Standard library imports
    import datetime
    import os
    
    # Third party imports
    from flask import Flask
    from flask_restful import Api
    from flask_sqlalchemy import SQLAlchemy
    
    # Local application imports
    from local_module import local_class
    from local_package import local_function
    
    5

Bạn có thể nhập

"""Illustration of good import statement styling.

Note that the imports come after the docstring.

"""

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function
1 vào tệp
└── project
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py
5 theo cách này

import abc
0

Bạn chỉ sử dụng một dấu chấm ở đây vì

import abc as other_name
3 nằm trong cùng thư mục với mô-đun hiện tại, đó là
import abc as other_name
2

Bạn có thể nhập

"""Illustration of good import statement styling.

Note that the imports come after the docstring.

"""

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function
3 và
"""Illustration of good import statement styling.

Note that the imports come after the docstring.

"""

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function
5 vào tệp
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
0 theo cách này

import abc
1

Trong câu lệnh nhập đầu tiên, dấu chấm đơn có nghĩa là bạn đang nhập

"""Illustration of good import statement styling.

Note that the imports come after the docstring.

"""

# Standard library imports
import datetime
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function
3 từ gói hiện tại. Hãy nhớ rằng việc nhập gói về cơ bản sẽ nhập tệp
import abc
4 của gói dưới dạng mô-đun

Trong câu lệnh nhập thứ hai, bạn sẽ sử dụng lại một dấu chấm vì

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2
3 nằm trong cùng thư mục với mô-đun hiện tại, đó là
import abc as other_name
5

Ưu và nhược điểm của nhập khẩu tương đối

Một lợi thế rõ ràng của nhập khẩu tương đối là chúng khá ngắn gọn. Tùy thuộc vào vị trí hiện tại, họ có thể biến câu lệnh nhập dài lố bịch mà bạn đã thấy trước đó thành một thứ đơn giản như thế này

import abc
2

Thật không may, quá trình nhập tương đối có thể lộn xộn, đặc biệt đối với các dự án được chia sẻ khi cấu trúc thư mục có thể thay đổi. Các lần nhập tương đối cũng không thể đọc được như các lần nhập tuyệt đối và không dễ để biết vị trí của các tài nguyên đã nhập

Loại bỏ các quảng cáo

Phần kết luận

Bạn đã hoàn thành tốt khóa học cấp tốc về nhập tuyệt đối và tương đối này. Bây giờ, bạn đã bắt kịp tốc độ hoạt động của tính năng nhập. Bạn đã học các phương pháp hay nhất để viết câu lệnh nhập và bạn biết sự khác biệt giữa nhập tuyệt đối và nhập tương đối

Với các kỹ năng mới của mình, bạn có thể tự tin nhập các gói và mô-đun từ thư viện chuẩn Python, gói của bên thứ ba và gói cục bộ của riêng bạn. Hãy nhớ rằng bạn thường nên chọn nhập tuyệt đối thay vì nhập tương đối, trừ khi đường dẫn phức tạp và sẽ khiến câu lệnh quá dài

Cảm ơn vì đã đọc

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

Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Nhập tuyệt đối và tương đối trong Python

🐍 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. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Nhập tệp Python từ cùng thư mục

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

Giới thiệu về Mbithe Nzomo

Nhập tệp Python từ cùng thư mục
Nhập tệp Python từ cùng thư mục

Tôi là một kỹ sư phần mềm có kinh nghiệm, quan tâm đến trí tuệ nhân tạo và máy học. Tôi hiện đang là sinh viên sau đại học tại Đại học Manchester, theo học Khoa học Máy tính Nâng cao với chuyên ngành AI

» Tìm hiểu thêm về Mbithe


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. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Nhập tệp Python từ cùng thư mục

Adriana

Nhập tệp Python từ cùng thư mục

David

Nhập tệp Python từ cùng thư mục

Joanna

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

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 »

Chuyên gia 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

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

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

Bạn nghĩ sao?

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

Tweet Chia sẻ Chia sẻ 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. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. 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

Làm cách nào để nhập các hàm từ một tệp Python khác trong cùng thư mục?

Nhớ file chứa định nghĩa hàm và file gọi hàm phải cùng thư mục. Để sử dụng các hàm được viết trong một tệp bên trong một tệp khác hãy bao gồm dòng nhập, from filename import function_name . Lưu ý rằng mặc dù tên tệp phải chứa một. phần mở rộng py,.

Điều gì xảy ra nếu tôi nhập cùng một mô-đun hai lần Python?

Điều gì xảy ra nếu một mô-đun được nhập hai lần? . there is no performance loss by importing it again.

Làm cách nào để nhập lớp từ tệp này sang tệp khác trong Python?

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