Làm thế nào để bao gồm mã Python bên ngoài để sử dụng trong các tệp khác?


117

Nếu bạn có một tập hợp các phương thức trong một tệp, có cách nào để đưa các tệp đó vào một tệp khác, nhưng gọi chúng mà không có bất kỳ tiền tố nào (tức là tiền tố tệp) không?

Vì vậy, nếu tôi có:

[Math.py]
def Calculate ( num )

Làm thế nào để tôi gọi nó như thế này:

[Tool.py]
using Math.py

for i in range ( 5 ) :
    Calculate ( i )

Câu trả lời:


154

Bạn sẽ cần nhập tệp khác dưới dạng mô-đun như sau:

import Math

Nếu bạn không muốn đặt tiền tố Calculatehàm của mình bằng tên mô-đun thì hãy làm như sau:

from Math import Calculate

Nếu bạn muốn nhập tất cả các thành viên của một mô-đun thì hãy làm như sau:

from Math import *

Chỉnh sửa: Đây là một chương hay từ Dive Into Python đi sâu hơn một chút về chủ đề này.


9
Đáng chú ý là from Math import *được không được khuyến khích .
naught101

1
Bạn có thể thú vị impmô-đun và cuộc gọi kỳ diệu __import__.
Vitold S.

Ai đó đã quên gia hạn miền của họ: \
Spechal

48

Chỉ cần viết lệnh "include":

import os

def include(filename):
    if os.path.exists(filename): 
        execfile(filename)


include('myfile.py')

@Deleet:

@bfieck nhận xét là chính xác, để tương thích với python 2 và 3, bạn cần:

Python 2 và 3: thay thế 1

from past.builtins import execfile

execfile('myfile.py')

Python 2 và 3: thay thế 2

exec(compile(open('myfile.py').read()))

3
Có lý do gì để làm điều này from module import *? Ngoài ra, nếu tệp bạn đang gọi có mã trong nội dung, mã đó sẽ được chạy, nếu bạn làm điều này.
naught101

4
@ naught101: Đó là mục tiêu: chạy mã, điều này không xảy ra với quá trình nhập. Thông thường, nó chỉ định nghĩa các biến.
Louis

2
@Deleet python 3 không cóexecfile
bfieck 15/09/2016

7
Trên thực tế python 3 có một chữ ký khác cho compile()hơn đã đề cập. Vì vậy, đúng Python 2 và 3: thay thế 2 sẽ là:exec(compile(source=open('myfile.py').read(), filename='myfile.py', mode='exec'))
TriAnMan 15/12/16

3
Các 'bao gồm' chức năng helper không làm việc nếu bạn muốn có các biến trong file bao gồm trong phạm vi trong người gọi của 'bao gồm'
paulj

35

Nếu bạn dùng:

import Math

thì điều đó sẽ cho phép bạn sử dụng các hàm của Math, nhưng bạn phải thực hiện Math.Calculate, vì vậy đó rõ ràng là điều bạn không muốn.

Nếu bạn muốn nhập các chức năng của mô-đun mà không cần phải thêm tiền tố vào chúng, bạn phải đặt tên rõ ràng cho chúng, như:

from Math import Calculate, Add, Subtract

Bây giờ, bạn có thể tham chiếu Tính, Thêm và Trừ chỉ bằng tên của chúng. Nếu bạn muốn nhập TẤT CẢ các hàm từ Math, hãy thực hiện:

from Math import *

Tuy nhiên, bạn nên rất cẩn thận khi thực hiện việc này với các mô-đun có nội dung mà bạn không chắc chắn. Nếu bạn nhập hai mô-đun có chứa các định nghĩa cho cùng một tên hàm, một hàm sẽ ghi đè hàm còn lại, với bạn thì không ai khôn ngoan hơn.


1

Tôi thấy mô-đun kiểm tra python rất hữu ích

Ví dụ với teststuff.py

import inspect

def dostuff():
    return __name__

DOSTUFF_SOURCE = inspect.getsource(dostuff)

if __name__ == "__main__":

    dostuff()

Và từ một tập lệnh khác hoặc bảng điều khiển python

import teststuff

exec(DOSTUFF_SOURCE)

dostuff()

Và bây giờ dostuff sẽ nằm trong phạm vi cục bộ và dostuff () sẽ trả về bảng điều khiển hoặc các tập lệnh _ name _ trong khi thực thi test.dostuff () sẽ trả về tên mô-đun python.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.