Windows Python không tìm thấy mô-đun

tên của môi trường cấp cao nhất của chương trình, có thể được kiểm tra bằng cách sử dụng biểu thức

>>> __name__
'__main__'
1;

  • tệp

    >>> __name__
    '__main__'
    
    2 trong các gói Python

  • Cả hai cơ chế này đều liên quan đến các mô-đun Python; . Chúng được giải thích chi tiết dưới đây. Nếu bạn chưa quen với các mô-đun Python, hãy xem phần hướng dẫn để biết phần giới thiệu

    >>> __name__
    '__main__'
    
    1

    Khi một mô-đun hoặc gói Python được nhập,

    >>> __name__
    '__main__'
    
    4 được đặt thành tên của mô-đun. Thông thường, đây là tên của chính tệp Python không có phần mở rộng
    >>> __name__
    '__main__'
    
    5

    >>> import configparser
    >>> configparser.__name__
    'configparser'
    

    Nếu tệp là một phần của gói,

    >>> __name__
    '__main__'
    
    4 cũng sẽ bao gồm đường dẫn của gói mẹ

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    

    Tuy nhiên, nếu mô-đun được thực thi trong môi trường mã cấp cao nhất, thì

    >>> __name__
    '__main__'
    
    4 của nó được đặt thành chuỗi
    >>> __name__
    '__main__'
    
    8

    "Môi trường mã cấp cao nhất" là gì?

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9 là tên của môi trường nơi mã cấp cao nhất được chạy. “Mã cấp cao nhất” là mô-đun Python do người dùng chỉ định đầu tiên bắt đầu chạy. Đó là "cấp cao nhất" vì nó nhập tất cả các mô-đun khác mà chương trình cần. Đôi khi “mã cấp cao nhất” được gọi là điểm vào ứng dụng

    Môi trường mã cấp cao nhất có thể là

    • phạm vi của lời nhắc tương tác

      >>> __name__
      '__main__'
      

    • mô-đun Python được chuyển tới trình thông dịch Python dưới dạng đối số tệp

      $ python3 helloworld.py
      Hello, world!
      

    • mô-đun hoặc gói Python được chuyển tới trình thông dịch Python với đối số

      $ python3 -m tarfile
      usage: tarfile.py [-h] [-v] [...]
      

    • Mã Python được trình thông dịch Python đọc từ đầu vào tiêu chuẩn

      $ echo "import this" | python3
      The Zen of Python, by Tim Peters
      
      Beautiful is better than ugly.
      Explicit is better than implicit.
      ...
      

    • Mã Python được chuyển tới trình thông dịch Python với đối số

      $ python3 -c "import this"
      The Zen of Python, by Tim Peters
      
      Beautiful is better than ugly.
      Explicit is better than implicit.
      ...
      

    Trong mỗi tình huống này,

    >>> __name__
    '__main__'
    
    4 của mô-đun cấp cao nhất được đặt thành
    >>> __name__
    '__main__'
    
    8

    Kết quả là, một mô-đun có thể khám phá xem nó có đang chạy trong môi trường cấp cao nhất hay không bằng cách kiểm tra

    >>> __name__
    '__main__'
    
    4 của chính nó, điều này cho phép một thành ngữ chung cho mã thực thi có điều kiện khi mô-đun không được khởi tạo từ câu lệnh nhập

    if __name__ == '__main__':
        # Execute when the module is not initialized from an import statement.
        ...
    

    Xem thêm

    Để có cái nhìn chi tiết hơn về cách thiết lập

    >>> __name__
    '__main__'
    
    4 trong mọi tình huống, hãy xem phần hướng dẫn

    Cách sử dụng thành ngữ

    Một số mô-đun chứa mã chỉ dành cho mục đích sử dụng tập lệnh, chẳng hạn như phân tích đối số dòng lệnh hoặc tìm nạp dữ liệu từ đầu vào tiêu chuẩn. Nếu một mô-đun như thế này được nhập từ một mô-đun khác, chẳng hạn như để kiểm tra đơn vị nó, mã tập lệnh cũng sẽ vô tình thực thi

    Đây là nơi sử dụng khối mã

    $ python3 helloworld.py
    Hello, world!
    
    6 có ích. Mã trong khối này sẽ không chạy trừ khi mô-đun được thực thi trong môi trường cấp cao nhất

    Đặt càng ít câu lệnh càng tốt vào khối bên dưới

    $ python3 helloworld.py
    Hello, world!
    
    7 có thể cải thiện tính rõ ràng và chính xác của mã. Thông thường, một chức năng có tên
    $ python3 helloworld.py
    Hello, world!
    
    8 gói gọn hành vi chính của chương trình

    # echo.py
    
    import shlex
    import sys
    
    def echo[phrase: str] -> None:
       """A dummy wrapper around print."""
       # for demonstration purposes, you can imagine that there is some
       # valuable and reusable logic inside this function
       print[phrase]
    
    def main[] -> int:
        """Echo the input arguments to standard output"""
        phrase = shlex.join[sys.argv]
        echo[phrase]
        return 0
    
    if __name__ == '__main__':
        sys.exit[main[]]  # next section explains the use of sys.exit
    

    Lưu ý rằng nếu mô-đun không đóng gói mã bên trong hàm

    $ python3 helloworld.py
    Hello, world!
    
    8 mà thay vào đó đặt nó trực tiếp trong khối
    $ python3 helloworld.py
    Hello, world!
    
    6, thì biến
    $ python3 -m tarfile
    usage: tarfile.py [-h] [-v] [...]
    
    1 sẽ là toàn cục cho toàn bộ mô-đun. Điều này dễ xảy ra lỗi vì các chức năng khác trong mô-đun có thể vô tình sử dụng biến toàn cục thay vì tên cục bộ. Hàm
    $ python3 helloworld.py
    Hello, world!
    
    8 giải quyết vấn đề này

    Sử dụng hàm

    $ python3 helloworld.py
    Hello, world!
    
    8 có thêm lợi ích là bản thân hàm
    $ python3 -m tarfile
    usage: tarfile.py [-h] [-v] [...]
    
    4 được tách biệt và có thể nhập ở nơi khác. Khi
    $ python3 -m tarfile
    usage: tarfile.py [-h] [-v] [...]
    
    5 được nhập, các hàm
    $ python3 -m tarfile
    usage: tarfile.py [-h] [-v] [...]
    
    4 và
    $ python3 helloworld.py
    Hello, world!
    
    8 sẽ được xác định, nhưng cả hai hàm này sẽ không được gọi, bởi vì
    $ python3 -m tarfile
    usage: tarfile.py [-h] [-v] [...]
    
    8

    cân nhắc đóng gói

    $ python3 helloworld.py
    Hello, world!
    
    8 chức năng thường được sử dụng để tạo các công cụ dòng lệnh bằng cách chỉ định chúng làm điểm nhập cho tập lệnh bảng điều khiển. Khi điều này được thực hiện, pip sẽ chèn lời gọi hàm vào tập lệnh mẫu, trong đó giá trị trả về của
    $ python3 helloworld.py
    Hello, world!
    
    8 được chuyển vào. Ví dụ

    sys.exit[main[]]
    

    Vì lệnh gọi tới

    $ python3 helloworld.py
    Hello, world!
    
    8 được gói gọn trong , nên kỳ vọng là hàm của bạn sẽ trả về một số giá trị được chấp nhận làm đầu vào cho ;

    Bằng cách chủ động tuân theo quy ước này, mô-đun của chúng ta sẽ có hành vi tương tự khi chạy trực tiếp [i. e.

    $ echo "import this" | python3
    The Zen of Python, by Tim Peters
    
    Beautiful is better than ugly.
    Explicit is better than implicit.
    ...
    
    6] như nó sẽ có nếu sau này chúng tôi đóng gói nó dưới dạng điểm nhập tập lệnh bảng điều khiển trong gói có thể cài đặt pip

    Đặc biệt, hãy cẩn thận khi trả về các chuỗi từ hàm

    $ python3 helloworld.py
    Hello, world!
    
    8 của bạn. sẽ diễn giải một đối số chuỗi dưới dạng thông báo lỗi, vì vậy chương trình của bạn sẽ có mã thoát là
    $ echo "import this" | python3
    The Zen of Python, by Tim Peters
    
    Beautiful is better than ugly.
    Explicit is better than implicit.
    ...
    
    9, biểu thị lỗi và chuỗi sẽ được ghi vào. Ví dụ
    $ python3 -m tarfile
    usage: tarfile.py [-h] [-v] [...]
    
    5 từ trước minh họa bằng cách sử dụng quy ước
    $ python3 -c "import this"
    The Zen of Python, by Tim Peters
    
    Beautiful is better than ugly.
    Explicit is better than implicit.
    ...
    
    2

    Xem thêm

    Hướng dẫn sử dụng gói Python chứa một tập hợp các hướng dẫn và tài liệu tham khảo về cách phân phối và cài đặt các gói Python bằng các công cụ hiện đại

    >>> __name__
    '__main__'
    
    2 trong Gói Python

    Nếu bạn không quen thuộc với các gói Python, hãy xem phần hướng dẫn. Thông thường nhất, tệp

    >>> __name__
    '__main__'
    
    2 được sử dụng để cung cấp giao diện dòng lệnh cho một gói. Hãy xem xét gói giả thuyết sau đây, “bandclass”

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    0

    >>> __name__
    '__main__'
    
    2 sẽ được thực thi khi chính gói đó được gọi trực tiếp từ dòng lệnh bằng cờ. Ví dụ

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    1

    Lệnh này sẽ khiến

    >>> __name__
    '__main__'
    
    2 chạy. Cách bạn sử dụng cơ chế này sẽ phụ thuộc vào bản chất của gói bạn đang viết, nhưng trong trường hợp giả định này, có thể hợp lý nếu cho phép giáo viên tìm kiếm học sinh

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    2

    Lưu ý rằng

    $ python3 -c "import this"
    The Zen of Python, by Tim Peters
    
    Beautiful is better than ugly.
    Explicit is better than implicit.
    ...
    
    8 là một ví dụ về nhập tương đối. Kiểu nhập này có thể được sử dụng khi tham chiếu các mô-đun trong một gói. Để biết thêm chi tiết, xem trong phần hướng dẫn

    Cách sử dụng thành ngữ

    Nội dung của

    >>> __name__
    '__main__'
    
    2 thường không được rào bằng khối
    $ python3 helloworld.py
    Hello, world!
    
    6. Thay vào đó, các tệp đó được giữ ngắn gọn, các chức năng để thực thi từ các mô-đun khác. Những mô-đun khác sau đó có thể dễ dàng kiểm tra đơn vị và có thể tái sử dụng đúng cách

    Nếu được sử dụng, khối

    $ python3 helloworld.py
    Hello, world!
    
    6 sẽ vẫn hoạt động như mong đợi đối với tệp
    >>> __name__
    '__main__'
    
    2 trong một gói vì thuộc tính
    >>> __name__
    '__main__'
    
    4 của nó sẽ bao gồm đường dẫn của gói nếu được nhập

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    3

    Điều này sẽ không hoạt động đối với các tệp

    >>> __name__
    '__main__'
    
    2 trong thư mục gốc của một. tập tin zip mặc dù. Do đó, để đảm bảo tính nhất quán, nên ưu tiên sử dụng tối thiểu
    >>> __name__
    '__main__'
    
    2 như đề cập bên dưới

    Xem thêm

    Xem ví dụ về gói có

    >>> __name__
    '__main__'
    
    2 tối thiểu trong thư viện tiêu chuẩn. Nó không chứa khối
    $ python3 helloworld.py
    Hello, world!
    
    6. Bạn có thể gọi nó bằng
    # echo.py
    
    import shlex
    import sys
    
    def echo[phrase: str] -> None:
       """A dummy wrapper around print."""
       # for demonstration purposes, you can imagine that there is some
       # valuable and reusable logic inside this function
       print[phrase]
    
    def main[] -> int:
        """Echo the input arguments to standard output"""
        phrase = shlex.join[sys.argv]
        echo[phrase]
        return 0
    
    if __name__ == '__main__':
        sys.exit[main[]]  # next section explains the use of sys.exit
    
    0

    Xem để biết thêm chi tiết về cờ cho trình thông dịch thực thi

    Xem để biết cách chạy các ứng dụng được đóng gói dưới dạng. tập tin zip. Trong trường hợp này, Python tìm tệp

    >>> __name__
    '__main__'
    
    2 trong thư mục gốc của kho lưu trữ

    # echo.py
    
    import shlex
    import sys
    
    def echo[phrase: str] -> None:
       """A dummy wrapper around print."""
       # for demonstration purposes, you can imagine that there is some
       # valuable and reusable logic inside this function
       print[phrase]
    
    def main[] -> int:
        """Echo the input arguments to standard output"""
        phrase = shlex.join[sys.argv]
        echo[phrase]
        return 0
    
    if __name__ == '__main__':
        sys.exit[main[]]  # next section explains the use of sys.exit
    
    5

    Bất kể chương trình Python được bắt đầu với mô-đun nào, các mô-đun khác đang chạy trong cùng chương trình đó có thể nhập phạm vi của môi trường cấp cao nhất [] bằng cách nhập mô-đun

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9. Thao tác này không nhập tệp
    >>> __name__
    '__main__'
    
    2 mà nhập bất kỳ mô-đun nào nhận được tên đặc biệt
    >>> __name__
    '__main__'
    
    8

    Đây là một mô-đun ví dụ sử dụng không gian tên

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    4

    Ví dụ sử dụng mô-đun này có thể như sau

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    5

    Bây giờ, nếu chúng ta bắt đầu chương trình của mình, kết quả sẽ như thế này

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    6

    Mã thoát của chương trình sẽ là 1, cho biết có lỗi. Bỏ ghi chú dòng với

    sys.exit[main[]]
    
    0 sẽ sửa chương trình và bây giờ chương trình thoát với mã trạng thái 0, biểu thị thành công

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    7

    Lưu ý rằng việc nhập

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9 không gây ra bất kỳ sự cố nào với mã cấp cao nhất đang chạy ngoài ý muốn dành cho việc sử dụng tập lệnh được đặt trong khối
    sys.exit[main[]]
    
    2 của mô-đun
    sys.exit[main[]]
    
    3. Tại sao điều này làm việc?

    Python chèn một mô-đun

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9 trống vào khi khởi động trình thông dịch và điền vào mô-đun đó bằng cách chạy mã cấp cao nhất. Trong ví dụ của chúng tôi, đây là mô-đun
    sys.exit[main[]]
    
    3 chạy từng dòng một và nhập khẩu
    sys.exit[main[]]
    
    7. Đổi lại,
    sys.exit[main[]]
    
    7 nhập khẩu
    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9 [thực ra là
    sys.exit[main[]]
    
    3]. Đó là một chu kỳ nhập khẩu. May mắn thay, vì mô-đun
    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9 được điền một phần có trong , nên Python chuyển nó tới
    sys.exit[main[]]
    
    7. Xem trong tài liệu tham khảo của hệ thống nhập khẩu để biết chi tiết về cách thức hoạt động của nó

    REPL của Python là một ví dụ khác về “môi trường cấp cao nhất”, vì vậy mọi thứ được định nghĩa trong REPL đều trở thành một phần của phạm vi

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    8

    Lưu ý rằng trong trường hợp này, phạm vi

    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    9 không chứa thuộc tính
    >>> from concurrent.futures import process
    >>> process.__name__
    'concurrent.futures.process'
    
    06 vì nó tương tác

    Tôi có thể tìm các mô-đun Python Windows ở đâu?

    Các gói Python được cài đặt ở đâu trong Windows? .
    Có thể tìm thấy các gói Python được cài đặt trên toàn cầu trong \Program Files\
    Locally installed Python packages can only be used by the user that installed them. Therefore, they can be found under. \Users\\AppData\Local\Programs\.

    Tại sao tôi không thể cài đặt các mô-đun trong Python?

    Đầu tiên đảm bảo rằng bạn đã cài đặt Python . Giả sử như vậy, điều đầu tiên cần làm là kiểm tra xem mô-đun có tồn tại không. Cách chính để thực hiện việc này là truy cập PyPi và tìm kiếm gói của bạn. Nếu không có gì xuất hiện, hãy đảm bảo thực hiện tìm kiếm nhanh trên google để xem bạn có đang tìm đúng tên không.

    Điều đó có nghĩa là gì khi nó nói không tìm thấy mô-đun?

    Lỗi 'không tìm thấy mô-đun' là lỗi cú pháp xuất hiện khi câu lệnh nhập tĩnh không thể tìm thấy tệp tại đường dẫn đã khai báo . Lỗi cú pháp phổ biến này là do sự không nhất quán về cách viết hoa chữ cái có trong [các] tên tệp của bạn giữa kho lưu trữ và máy cục bộ hoặc cả hai.

    Làm cách nào để cài đặt các gói Python trong Windows?

    Đảm bảo bạn có thể chạy pip từ dòng lệnh . py. 2 Điều này sẽ cài đặt hoặc nâng cấp pip. Ngoài ra, nó sẽ cài đặt các công cụ thiết lập và bánh xe nếu chúng chưa được cài đặt. Hãy thận trọng nếu bạn đang sử dụng bản cài đặt Python do hệ điều hành của bạn hoặc trình quản lý gói khác quản lý

    Chủ Đề