2010-10-28 34 views
188

Tệp __main__.py là gì, loại mã nào tôi nên đưa vào đó và khi nào tôi nên có mã?__main__.py là gì?

+0

'__init __. Py' phục vụ một mục đích khác với' __main __. Py' không - không thực sự hiểu tại sao điều này được đánh dấu là trùng lặp. RAS, bạn có thể giải thích? –

Trả lời

193

Thông thường, một chương trình Python được điều hành bằng cách đặt tên file py trên dòng lệnh:

$ python my_program.py 

Bạn cũng có thể tạo một thư mục hoặc zipfile đầy đủ các mã, và bao gồm một __main__.py. Sau đó, bạn chỉ có thể đặt tên cho thư mục hoặc zipfile trên dòng lệnh, và nó thực thi __main__.py tự động:

$ python my_program_dir 
$ python my_program.zip 
# Or, if the program is accessible as a module 
$ python -m my_program 

Bạn sẽ phải tự quyết định xem ứng dụng của bạn có thể được hưởng lợi từ được thực thi như thế này.

18

__main__.py được sử dụng cho các chương trình python trong các tệp zip. Tệp __main__.py sẽ được thực thi khi tệp zip chạy. Ví dụ, nếu file zip là như vậy:

test.zip 
    __main__.py 

và các nội dung của __main__.py

import sys 
print "hello %s" % sys.argv[1] 

Sau đó, nếu chúng ta chạy python test.zip world chúng tôi sẽ nhận được hello world ra.

Vì vậy, tệp __main__.py chạy khi python được gọi trên tệp zip.

11

Nếu tập lệnh của bạn là thư mục hoặc tệp ZIP thay vì tệp python đơn, __main__.py sẽ được thực thi khi "tập lệnh" được chuyển làm đối số cho trình thông dịch trăn.

12

Bạn tạo __main__.py trong yourpackage để làm cho nó thực thi như:

$ python -m yourpackage 
42

file __main__.py là gì?

Khi tạo mô-đun Python, thông thường mô đun thực thi một số chức năng (thường chứa trong hàm main) khi chạy làm điểm nhập của chương trình. Điều này thường được thực hiện với sự thành ngữ phổ biến sau đây được đặt ở dưới cùng của hầu hết các file Python:

if __name__ == '__main__': 
    # execute only if run as the entry point into the program 
    main() 

Bạn có thể nhận được ngữ nghĩa tương tự cho một gói Python với __main__.py. Đây là một dấu nhắc shell linux, $, nếu bạn không có Bash (hay cách khác Posix vỏ) trên Windows chỉ tạo ra các tệp này demo/__<init/main>__.py with contents in between the EOF`s:

$ mkdir demo 
$ cat > demo/__init__.py << EOF 
print('demo/__init__.py executed') 
def main(): 
    print('main executed') 
EOF 
$ cat > demo/__main__.py << EOF 
print('demo/__main__.py executed') 
from __init__ import main 
main() 
EOF 

(Trong một vỏ Posix/Bash, bạn có thể làm như trên mà không có << EOF s và kết thúc EOF s bằng cách nhập tổ hợp phím Ctrl-D, nhân vật end-of-file, ở phần cuối của mỗi lệnh cat)

và bây giờ:

$ python demo 
demo/__main__.py executed 
demo/__init__.py executed 
main executed 

Bạn có thể lấy được từ tài liệu này ion.Các documentation nói:

__main__ - môi trường kịch bản cấp cao nhất

'__main__' là tên của phạm vi trong đó mã cấp cao nhất thực hiện. Mô-đun __name__ của mô-đun được đặt bằng '__main__' khi đọc từ đầu vào tiêu chuẩn , tập lệnh hoặc từ lời nhắc tương tác.

Một mô-đun có thể khám phá hay không nó đang chạy trong phạm vi chính bằng cách kiểm tra riêng __name__ của nó, cho phép một thành ngữ phổ biến đối với có điều kiện thực thi mã trong một module khi nó được chạy như một kịch bản hay với python -m nhưng không phải khi nó được nhập khẩu:

if __name__ == '__main__': 
     # execute only if run as a script 
     main() 

Đối với một gói, tác dụng tương tự có thể đạt được bằng cách bao gồm một module __main__.py, nội dung trong đó sẽ được thực hiện khi các mô-đun được chạy với -m.

nén

Bạn cũng có thể gói này vào một tập tin duy nhất và chạy nó từ dòng lệnh như thế này - nhưng lưu ý rằng các gói nén không thể thực hiện gói con hoặc submodules như điểm mấu chốt:

$ python -m zipfile -c demozip demo/* 
$ python demozip 
demo/__main__.py executed 
demo/__init__.py executed 
main() executed 
Các vấn đề liên quan