Hướng dẫn python if __name__ == __main__ args - python nếu __name__ == __main__ args

Tôi đang cố gắng giải quyết một vấn đề mà tôi đã gặp phải trong một đoạn mã tôi cần xây dựng. Tôi có một mô -đun Python mà tôi cần có khả năng nhập và chuyển các đối số sau đó sẽ được phân tích cú pháp bởi mô -đun chính. Những gì tôi đã được đưa ra trông như thế này:

#main.py
if __name__ == '__main__' 
    sys.argv[] #pass arguments if given and whatnot
    Do stuff...

Điều tôi cần là thêm một hàm

#hello_main.py 
import main.py

print(main.main("Hello, main"))
4 có thể lấy (các) đối số và phân tích chúng và sau đó truyền chúng như vậy:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...

Tóm lại: Tôi cần nhập main.py và truyền trong các đối số được phân tích cú pháp bởi hàm

#hello_main.py 
import main.py

print(main.main("Hello, main"))
4 và sau đó cung cấp thông tin được trả lại cho phần
#hello_main.py 
import main.py

print(main.main("Hello, main"))
6.

Chỉnh sửa để làm rõ những gì tôi đang làm To clarify what I am doing

#hello_main.py 
import main.py

print(main.main("Hello, main"))

Ngoài ra tôi vẫn muốn có thể gọi Main.py từ Shell thông qua I want to still be able to call main.py from shell via

$: python main.py "Hello, main"

Do đó bảo tồn tên == chínhname == main

Là những gì tôi đang hỏi thậm chí có thể? Tôi đã dành phần tốt hơn của ngày hôm nay để nghiên cứu vấn đề này bởi vì tôi muốn, nếu có thể, hãy bảo tồn mô -đun chính mà tôi đã được đưa ra.

Thanks,

DMG

Trong khi đọc một chương trình Python, bạn có thể tìm thấy biểu thức nếu __name__ == ‘__main__. Hãy để một cái nhìn về ý nghĩa của nó và tại sao bạn nên biết về nó.if __name__ == ‘__main__’. Let’s have a look at what it means and why you should know about it.

Điều kiện nếu __name__ == ‘__main__, được sử dụng trong chương trình Python để thực thi mã bên trong câu lệnh IF chỉ khi chương trình được thực hiện trực tiếp bởi trình thông dịch Python. Khi mã trong tệp được nhập dưới dạng mô -đun, mã bên trong câu lệnh IF không được thực thi.

Có thể không rõ ràng tại sao điều này được thực hiện và với hướng dẫn này, lý do sẽ trở nên rõ ràng.

Ở đây chúng tôi đi!

  • __Main__ trong Python là gì?
  • Các giá trị của biến Python __name__
  • Một ví dụ để hiểu __name__ trong Python
  • Kiểm tra xem __name__ có bằng __main__ khi nhập mô -đun không
  • Phương pháp chính của Python
  • Python __name__, __main__ và đối số
  • Sự kết luận

Bây giờ bạn đã biết cách sử dụng biến __name__ trong các chương trình Python của bạn.

Nó cho phép bao gồm mã không được thực thi nếu mô -đun của bạn được nhập bởi một chương trình khác.

Hãy tưởng tượng nếu người khác muốn sử dụng các chức năng bạn đã tạo nhưng không muốn tự động thực hiện một loạt logic mà bạn đã triển khai khi ứng dụng của bạn được thực thi trực tiếp.

>>> __name__
'__main__' 

Và bây giờ tôi có một câu hỏi nhỏ cho bạn…

Bạn có nhớ tên ngắn mà bạn có thể sử dụng cho biến __name__ thay vì gọi nó là Double Double Name Tên Double Undercore không? 🙂

>>> import random
>>> random.__name__
'random' 

OK, vì vậy sau khi nhập mô -đun ngẫu nhiên, chúng ta có thể thấy rằng giá trị của __name__ cho mô -đun là ‘ngẫu nhiên về cơ bản là tên của mô -đun.

Chúng tôi đang nhận được một nơi nào đó nhưng có lẽ nếu chúng tôi tạo chương trình Python của riêng mình, điều này có thể trở nên rõ ràng hơn.

Các giá trị của biến Python __name__

Tạo một tệp có tên là hiểu biết_name_main.py, tệp này chứa mã sau:

print("The value of __name__ is {}".format(__name__)) 

Một câu lệnh in duy nhất sử dụng phương thức định dạng chuỗi để in giá trị của __name__.

Hãy để xem những gì xảy ra khi:

  1. Chúng tôi thực hiện trực tiếp mã này.
  2. Tệp được nhập dưới dạng mô -đun (một tệp chứa mã Python có thể được nhập bằng cách sử dụng câu lệnh nhập và bằng cách lấy đi .Py ở cuối tên tệp).

Khi chúng tôi thực thi mã trực tiếp bằng cách tham chiếu tệp Python, giá trị của __name__ là __main__:

$ python understand_name_main.py
The value of __name__ is __main__ 

Thay vào đó, nếu chúng ta nhập mô -đun từ vỏ Python, giá trị của __name__ là

>>> import understand_name_main
The value of __name__ is understand_name_main 

… Hiểu được_name_main.

Vì vậy, tên của mô -đun. Theo cùng một cách chúng ta đã thấy trước đây với mô -đun ngẫu nhiên Python.

Vì vậy, giá trị của __name__ thay đổi tùy thuộc vào cách thực hiện mã python của chúng tôi.

Nhưng tại sao? Và làm thế nào điều này có thể giúp chúng ta với tư cách là nhà phát triển?

Một ví dụ để hiểu __name__ trong Python

Chúng tôi đã thấy làm thế nào giá trị của các thay đổi __name__varable tùy thuộc vào cách chúng tôi thực thi mã của chúng tôi.

Nhưng, làm thế nào để chúng ta sử dụng điều kiện nếu __name__ == __main__, trong các chương trình Python của chúng ta?if __name__ == “__main__” in our Python programs?

Để giải thích khái niệm này, chúng tôi sẽ tạo ra một chương trình Python gọi ba chức năng khác nhau. Chúng tôi sẽ sử dụng cùng một tệp hiểu_name_main.py:

def step1():
    print("Executing step1...")

def step2():
    print("Executing step2...")

def step3():
    print("Executing step3...")

step1()
step2()
step3() 

Mã này chạy ba chức năng. Việc triển khai chức năng ba là một tuyên bố in đơn giản vì tôi muốn bạn tập trung vào khái niệm đằng sau việc này chứ không phải vào việc thực hiện các chức năng:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
0

Bây giờ, hãy để nói rằng một chương trình Python khác cần sử dụng chức năng Bước1 (). Để làm điều đó, chúng tôi sẽ phải nhập tệp của chúng tôi dưới dạng mô -đun.

Đây là những gì xảy ra khi chúng ta làm điều đó:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
1

Sau khi nhập mô -đun, chúng tôi có thể thực thi hàm Bước1 (). Vấn đề là khi chúng tôi nhập mô -đun, ba dòng bên dưới sẽ tự động thực hiện:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
2

Làm thế nào chúng ta có thể tránh điều đó?

Kiểm tra xem __name__ có bằng __main__ khi nhập mô -đun không

Để ngăn chặn hành vi mà chúng ta đã thấy trong phần trước xảy ra, chúng ta có thể kiểm tra xem giá trị của __name__ có bằng với __main__ hay không.

Theo cách này, mã bên trong điều kiện IF chỉ được thực thi nếu tệp python được gọi trực tiếp và không khi nó được nhập dưới dạng mô -đun.

Chương trình của chúng tôi trở thành:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
3

Hãy để xác nhận rằng ba chức năng vẫn được thực thi khi chúng tôi gọi trực tiếp chương trình Python:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
0

Và ba chức năng không được thực thi khi chúng tôi nhập này dưới dạng mô -đun:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
5

Điều đó tốt hơn rất nhiều lần này!

Ngoài ra, hãy để giả sử mô -đun hiểu biết_name_main bao gồm hàng trăm chức năng và bạn không muốn nhập tất cả chúng.

Làm thế nào bạn có thể chỉ nhập hàm Bước1 ()?

Bạn có thể sử dụng cú pháp sau:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
6

Như bạn có thể thấy trong trường hợp này, chúng tôi chỉ nhập chức năng Bước 1 được thực thi thành công.

Khi chúng tôi cố gắng thực thi bước 2 (), nó không thành công với nameError: name ‘bước2, không được xác định.

Phương pháp chính của Python

Khái niệm chính là khá chuẩn trong các ngôn ngữ như Java hoặc C và nó đại diện cho điểm vào để thực hiện một chương trình.

Một cách tiếp cận phổ biến được sử dụng trong Python là tạo một hàm gọi là main () được thực thi bên trong câu lệnh IF kiểm tra giá trị của biến __name__.function called main() executed inside the if statement that checks the value of the __name__ variable.

Hàm chính () là nơi được gọi là nhiều hàm để có được kết quả cụ thể.

Trong trường hợp của chúng tôi, ba chức năng sẽ được gọi từ chức năng chính:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
7

Đặt tên cho hàm Main () chỉ là một quy ước đặt tên phổ biến làm tăng khả năng đọc của chương trình xem xét rằng khái niệm chính cũng được các nhà phát triển khác nổi tiếng.

Trong thực tế, không có gì ngăn cản chúng ta đưa ra một tên tùy ý khác cho chức năng chính.

Trước khi tiếp tục với hướng dẫn này xác nhận rằng mã được cập nhật của chúng tôi hoạt động tốt trong cả hai kịch bản:

  • Mã được thực thi trực tiếp
  • Mô -đun nhập khẩu

Python __name__, __main__ và đối số

Bên trong điều kiện IF kiểm tra xem biến __name__ có bằng với __main__, chúng tôi cũng có thể xử lý bất kỳ tham số nào được truyền cho ứng dụng Python của chúng tôi khi được gọi trực tiếp.

Để xử lý các đối số được chuyển cho ứng dụng, chúng tôi có thể sử dụng mô -đun SYS.sys module.

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
8

Trong mã này, chúng tôi làm như sau:

  • Nhập mô -đun SYS.
  • Xác định hàm chính () lấy một đối số làm đầu vào. Đối số này sẽ là một danh sách các chuỗi chứa các đối số được truyền cho ứng dụng khi được thực thi.
  • Chuyển sys.argv đến hàm chính () bên trong điều kiện IF xác minh giá trị của biến __name__.sys.argv to the main() function inside the if condition that verifies the value of the __name__ variable.

Đây là những gì xảy ra khi chúng tôi chạy chương trình trong thiết bị đầu cuối:

#main.py with def main()
def main(args):
    #parse args
    return args

if __name__ == '__main__':
    sys.argv[] #pass arguments if given and whatnot
    main(sys.argv)
    Do stuff...
9

Như bạn có thể thấy đối số đầu tiên nhận được bởi chương trình Python là tên của chính tệp .Py.

Hãy để cập nhật chức năng chính để in loại biến ARGS.

#hello_main.py 
import main.py

print(main.main("Hello, main"))
0

Nó xác nhận rằng Args là một danh sách:

#hello_main.py 
import main.py

print(main.main("Hello, main"))
1

Khi chuyển các đối số, chúng ta cũng có thể giải nén các đối số chúng ta cần trong chương trình của mình, ngoại trừ tên của chương trình:

#hello_main.py 
import main.py

print(main.main("Hello, main"))
2

Và đây là cách chúng tôi chạy chương trình này và kết quả chúng tôi lấy lại:

#hello_main.py 
import main.py

print(main.main("Hello, main"))
3

Mã này sử dụng toán tử cắt để lấy hai số được truyền qua dòng lệnh. Sau đó, nó chuyển hai số (tại thời điểm này vẫn ở định dạng chuỗi) cho hàm main ().slicing operator to take the two numbers passed via the command line. Then it passes the two numbers (at this point still in string format) to the main() function.

Hàm chính sau đó trả về sản phẩm của hai số được chuyển đổi thành số nguyên.

Sự kết luận

Bây giờ bạn đã biết cách sử dụng biến __name__ trong các chương trình Python của bạn.

Nó cho phép bao gồm mã không được thực thi nếu mô -đun của bạn được nhập bởi một chương trình khác.

Hãy tưởng tượng nếu người khác muốn sử dụng các chức năng bạn đã tạo nhưng không muốn tự động thực hiện một loạt logic mà bạn đã triển khai khi ứng dụng của bạn được thực thi trực tiếp.

Và bây giờ tôi có một câu hỏi nhỏ cho bạn…

Bạn có nhớ tên ngắn mà bạn có thể sử dụng cho biến __name__ thay vì gọi nó là Double Double Name Tên Double Undercore không? 🙂__name__ instead of calling it “double underscore name double underscore“? 🙂

Bài viết liên quan:

Hướng dẫn python if __name__ == __main__ args - python nếu __name__ == __main__ args

Tôi là một nhà lãnh đạo công nghệ, kỹ sư phần mềm và huấn luyện viên lập trình. Tôi muốn giúp bạn trong hành trình trở thành một nhà phát triển siêu!

Nếu __ tên __ == làm chính trong Python?

Các tệp Python có thể hoạt động như các mô -đun có thể tái sử dụng hoặc là chương trình độc lập. Nếu __name__ == Main Main: được sử dụng để thực thi một số mã chỉ khi tệp được chạy trực tiếp và không được nhập.execute some code only if the file was run directly, and not imported.

Nếu __ tên __ trong Python là gì?

Về mặt cú pháp, Python's If __name__ == "__main__" Idiom chỉ là một khối có điều kiện bình thường: 1if __name__ == "__main__" Dòng 1 đánh giá là đúng.a normal conditional block: 1if __name__ == "__main__": 2 ... The indented block starting in line 2 contains all the code that Python will execute when the conditional statement in line 1 evaluates to True .

Là nếu name == chính cần thiết?

Lý do đằng sau nếu __name__ == '__main__' trong Python bạn có thể đã thấy cái này trước đây: cú pháp thường bị bỏ qua vì nó dường như không cản trở việc thực thi mã của bạn.Có vẻ như không cần thiết, nhưng đó chỉ là khi bạn làm việc với một tệp Python duy nhất.It may not seem necessary, but that's only if you're working with a single Python file.

Chúng ta có thể chuyển các đối số trong main () trong Python không?

Dòng lệnh args mã python chính () ở trên bắt đầu bằng một dòng tiêu chuẩn CS106A args = sys.Argv [1:] thiết lập một danh sách có tên Args để chứa các chuỗi ARG dòng lệnh.Dòng này hoạt động và bạn luôn có thể sử dụng nó.you can always use it.