Xung đột tên mô-đun Python

Hôm nay tôi tình cờ đặt tên cho một trong các tệp
email của dự án của mình. py', xung đột với mô-đun của
cùng tên trong thư viện chuẩn của Python.

từ email. MIMEText nhập MIMEText

gây ra sự cố trong MIMEText sau này

Tệp "/usr/lib/python2. 3/smtplib. py", dòng 49, trong ?
từ email. mã hóa nhập base64MIME dưới dạng encode_base64
ImportError. Không có mô-đun nào có tên base64MIME

Có bất kỳ cơ chế nào để tham chiếu đến các mô-đun
của thư viện chuẩn để không xảy ra sự cố xung đột tên với
tên tệp cục bộ không?

hoặc bất kỳ giải pháp nào khác?

Chúc mừng bạn,
Chris

Gần đây tôi đang khắc phục sự cố nhập mô-đun khiến tôi tự hỏi làm thế nào Python xác định chính xác mô-đun nào sẽ nhập. Câu chuyện cơ bản ở đó là tôi đã cài đặt một mô-đun vào các gói trang web. Một mô-đun có cùng tên nằm trong thư mục của mô-đun hiện tại mà tôi đang phát triển [không phải là một kịch bản tuyệt vời ngoài cổng, nhưng hãy hiểu rằng tôi không kiểm soát được xung đột tên mô-đun cục bộ đó trong trường hợp này]

Để thiết kế ngược những gì Python đang làm, tôi thiết lập môi trường sau

$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
0

Tất cả những gì tôi đã làm ở đó là tạo một thư mục thử nghiệm, một môi trường ảo [và kích hoạt nó] và một ứng dụng tệp mô-đun thử nghiệm. py

Một phần quan trọng khác cần xem xét là biến môi trường

$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
1. Trên máy của tôi, cái này được đặt thành
$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
2. Đây là điều quan trọng cần nhớ

Bây giờ, tôi muốn sao chép bằng một mô-đun từ PyPI. Đối với điều này, tôi đang chọn mô-đun yêu cầu rất phổ biến

$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
3

Sau đây là nội dung của ứng dụng. py

$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
4

Tất cả những gì tôi đang làm ở đây là như sau [hiệu quả]

  1. Nhập mô-đun yêu cầu [bất cứ nơi nào nó có thể sống]
  2. In ra nội dung của sys. đường dẫn [thêm về điều này sau]
  3. Hiển thị thuộc tính tệp của mô-đun yêu cầu [một lần nữa, sẽ nói thêm về điều này sau]

Trong môi trường của tôi, hãy xem kết quả này

$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
5

Rất nhiều thông tin ở đây. Hãy mổ xẻ điều này, làm việc ngược lại. Như bạn có thể thấy, mô-đun yêu cầu đã được nhập từ thư mục

$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
6 của tôi. Đó là mong đợi. Nhưng danh sách các thư mục từ
$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
7 hiển thị thông tin thực sự tuyệt vời về vị trí mà Python tìm kiếm khi cố gắng nhập một mô-đun

Phá vỡ tất cả

Phần tử đầu tiên của sys. đường dẫn sẽ là thư mục hiện tại của mô-đun đang chạy quá trình nhập. Trong trường hợp của tôi, thư mục đó là. /module_import_test/

Nếu Python không tìm thấy mô-đun trong thư mục cục bộ, thì nó sẽ di chuyển đến các đường dẫn được chỉ định trong

$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
8. Trong trường hợp của tôi, tôi chỉ có một thư mục duy nhất là mục số 2 được liệt kê ở trên đó

Và sau đó Python sẽ xem qua một số thư mục dành riêng cho cài đặt, cuối cùng tìm kiếm trong các gói trang web [môi trường ảo của tôi]

Điều này có nghĩa là nếu tôi có một yêu cầu. py trong thư mục module_import_test của tôi, nó sẽ loại bỏ mọi thứ [đó là những gì tôi đang xử lý ban đầu]. Hãy chứng minh rằng

$ cd ~/dev/python
$ mkdir module_import_test
$ cd module_import_test
$ python3 -m venv venv
$ . venv/bin/activate
$ touch app.py
9

Hoàn hảo. Bây giờ Python đã tìm thấy các yêu cầu. py trong thư mục đầu tiên mà nó nhìn vào và có vẻ như nó đã dừng ở đó, không còn đi bộ nữa sys. đường dẫn để tìm bất kỳ lần xuất hiện nào khác của mô-đun yêu cầu khác. Mô-đun yêu cầu ban đầu mà tôi đã cài đặt không còn được nhập nữa

Tương tự như vậy, nếu tôi có một tệp yêu cầu. py sống trong $PYTHONPATH của tôi thì Python sẽ nhập nó và rút ngắn quá trình tìm kiếm, không bao giờ tìm kiếm trong thư mục gói trang web của tôi nơi mô-đun yêu cầu thực sự tồn tại

Tài liệu tham khảo không phải là một chức năng được gọi là không gian [], mà là một khái niệm được gọi là không gian tên. Không gian tên đề cập đến không gian hoặc vị trí trong tập lệnh nơi một tên nhất định sẽ được nhận dạng

Mức thụt đầu dòng ngoài cùng là không gian tên chung và mọi biến hoặc hàm được xác định ở đó sẽ được nhận dạng và có sẵn cho mọi hàm

Mỗi hàm có không gian tên riêng, được gọi là cục bộ của hàm. Các biến được xác định trong hàm không được nhận dạng hoặc có sẵn bên ngoài hàm

Khi một hàm cần một giá trị, nó sẽ tìm kiếm đầu tiên trong không gian tên cục bộ của nó. Nếu nó không thể tìm thấy giá trị ở đó, nó sẽ tìm trong không gian tên chung

Tại sao Python không nhận ra mô-đun của tôi?

Điều này là do phiên bản Python mà bạn đang chạy tập lệnh không được định cấu hình để tìm kiếm các mô-đun mà bạn đã cài đặt chúng. This happens when you use the wrong installation of pip to install packages.

Lỗi tên mô-đun trong Python là gì?

Trong Python, Lỗi Tên xảy ra khi bạn cố gắng sử dụng một biến, hàm hoặc mô-đun không tồn tại hoặc không được sử dụng theo cách hợp lệ. Some of the common mistakes that cause this error are: Using a variable or function name that is yet to be defined.

Các mô-đun Python nên được đặt tên như thế nào?

Tên gói và tên mô-đun Các mô-đun phải có tên viết tắt, toàn chữ thường . Dấu gạch dưới có thể được sử dụng trong tên mô-đun nếu nó cải thiện khả năng đọc. Các gói Python cũng phải có tên ngắn, viết thường, mặc dù việc sử dụng dấu gạch dưới không được khuyến khích.

Xung đột tên trong Python là gì?

Xung đột tên có thể xảy ra, ví dụ: nếu hai hoặc nhiều mô-đun Python chứa các mã định danh có cùng tên và được nhập vào cùng một chương trình . Trong ví dụ này, module1 và module2 được nhập vào cùng một chương trình. Mỗi mô-đun chứa một mã định danh có tên kép, trả về các kết quả rất khác nhau.

Chủ Đề