Hướng dẫn how do i include another python file in python? - làm cách nào để đưa một tệp python khác vào python?

Trong Python, một mô -đun là một đơn vị mã Python có thể được nhập (tải và sử dụng) bằng mã Python khác. Một mô -đun có thể chứa các định nghĩa (như các hàm và hằng số), cũng như các câu lệnh khởi tạo các định nghĩa đó. Khi mã mô -đun được viết, nó có thể được sử dụng lại bởi bất kỳ tập lệnh nào nhập mô -đun.module is a single unit of Python code that can be imported (loaded and used) by other Python code. A module can contain definitions (like functions and constants), as well as statements that initialize those definitions. Once the module code is written, it can be reused by any script that imports the module.

Một cách phổ biến để tạo mô -đun Python là tạo một tệp với tên tệp kết thúc bằng .py và viết mã mô -đun vào đó. Nếu chúng ta sử dụng một phần mở rộng tệp khác trong tên tệp hoặc không có tiện ích mở rộng nào, các câu lệnh import tiêu chuẩn được hiển thị bên dưới sẽ không hoạt động và chúng ta sẽ phải sử dụng importlib thay thế, đòi hỏi nhiều mã hơn (thêm thông tin bên dưới).

Để minh họa việc sử dụng tiêu chuẩn import, giả sử chúng tôi tạo một tệp có tên mymodule.py với định nghĩa chức năng sau:

Bây giờ mỗi khi chúng ta muốn viết "Xin chào, thế giới!" Đối với màn hình từ tập lệnh Python, chúng ta chỉ có thể nhập mô -đun này thay vì phải viết lại tin nhắn. Nó cũng cho phép chúng tôi thay đổi một dòng mã bên trong mymodule.py thay vì trong nhiều tập lệnh khác nhau nếu chúng tôi quyết định thay đổi thông báo mà chúng tôi muốn hiển thị trong tất cả các tập lệnh sử dụng chức năng này.

mymodule.py chứa hàm say_hello() mà chúng ta đã thấy ở trên.

Tên được sử dụng trong câu lệnh import chỉ đơn giản là tên tệp của mô -đun mà không có phần mở rộng .py ở cuối.

Phiên bản Python 3.3 và cao hơn cho phép nhập các mô -đun dễ dàng trong các thư mục con của thư mục của tập lệnh hiện tại. Nếu bạn đang sử dụng phiên bản Python thấp hơn 3.3, bạn có thể làm theo các bước trong nhập tệp trong một thư mục khác.

Trong một đường dẫn hệ thống tệp, chúng tôi sẽ tách các thành phần của đường dẫn bằng cách sử dụng

import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()
2 (Linux, MacOS, v.v.) hoặc
import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()
3 (Windows). Tuy nhiên, trong một câu lệnh Python import, chúng tôi phân tách các thành phần đường dẫn bằng DOT (
import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()
5).

trong đó

import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()
6 là bất kỳ tên nào chúng tôi chọn. Chúng tôi cũng có thể nhập chức năng trực tiếp:

Điều này hoạt động ngay cả khi có nhiều cấp độ của thư mục con. Ví dụ: nếu chúng ta có cấu trúc thư mục sau:

Bây giờ chúng ta hãy nói rằng chúng ta chuyển mymodule.py sang một thư mục bên ngoài cây thư mục hiện tại:

Theo mặc định, Python tìm các tệp trong cùng một thư mục (bao gồm cả thư mục con) là tệp tập lệnh hiện tại, cũng như ở các vị trí tiêu chuẩn khác được xác định trong

import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()
8. Nếu bạn tò mò những vị trí này là gì, bạn có thể in biến
import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()
8 như thế này:

Tuy nhiên, nếu tệp chúng tôi muốn nhập hoàn toàn ở một nơi khác, trước tiên chúng tôi sẽ phải nói với Python nơi để tìm bằng cách thêm các thư mục tìm kiếm vào

import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()
8. Trong ví dụ của chúng tôi, chúng tôi có thể viết trong .py1:

Lưu ý rằng đường dẫn được nối với

import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()
8 là một đường dẫn tuyệt đối. Nếu chúng tôi sử dụng một đường dẫn tương đối, đường dẫn sẽ giải quyết khác nhau dựa trên thư mục mà người dùng đang chạy tập lệnh, không liên quan đến đường dẫn của ____ 21.

Để nối một thư mục liên quan đến tệp tập lệnh này, bạn có thể sử dụng .py4 để lấy đường dẫn đầy đủ của tập lệnh hiện tại và xây dựng một đường dẫn đầy đủ để nhập từ đó. Trong .py1 chúng ta có thể viết:

Phiên bản Python 3.4 trở lên cung cấp chức năng thông qua thư viện importlib tích hợp cho phép chúng tôi tải bất kỳ tệp nào ở bất cứ đâu dưới dạng mô-đun Python, ngay cả khi tên tệp của tệp không kết thúc trong .py (nó có thể có phần mở rộng tệp khác hoặc không có phần mở rộng tệp ở tất cả).

Lưu ý ở đây rằng tên tệp .py8 không có phần mở rộng tệp. Trong trường hợp này, chúng tôi không thể sử dụng câu lệnh import đơn giản để nhập tệp đó. Thay vào đó, chúng ta có thể viết trong .py1:

Lưu ý rằng đường dẫn được truyền vào import1 là một đường dẫn tuyệt đối.Nếu chúng tôi sử dụng một đường dẫn tương đối như import2, đường dẫn sẽ giải quyết khác nhau dựa trên thư mục mà người dùng đang chạy tập lệnh, không liên quan đến đường dẫn của ____ 21.

Nếu chúng tôi muốn tham chiếu một tệp liên quan đến đường dẫn của tệp tập lệnh hiện tại của chúng tôi, chúng tôi có thể sử dụng .py4 để trước để lấy đường dẫn của tệp tập lệnh hiện tại của chúng tôi và sau đó xây dựng một đường dẫn đầy đủ từ đó:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import importlib.machinery
import importlib.util
from pathlib import Path

# Get path to mymodule
script_dir = Path( __file__ ).parent
mymodule_path = str( script_dir.joinpath( '..', 'alpha', 'beta', 'mymodule' ) )

# Import mymodule
loader = importlib.machinery.SourceFileLoader( 'mymodule', mymodule_path )
spec = importlib.util.spec_from_loader( 'mymodule', loader )
mymodule = importlib.util.module_from_spec( spec )
loader.exec_module( mymodule )

# Use mymodule
mymodule.say_hello()