2017-02-17 12 views
9

Tôi đã đọc how to check if a python module has been imported và hướng dẫn có vẻ rõ ràng, hãy kiểm tra mô-đun trong sys.modules. Điều này làm việc như tôi mong đợi trong Python 2, nhưng không phải với Python 3 (3,5 và 3,6 thử nghiệm). Ví dụ:Tại sao các mô-đun chưa được nhập trong 'sys.modules' trong Python 3?

Python 3,6

>>> import sys 
>>> 'itertools' in sys.modules 
True 

Python 2,7

>>> import sys 
>>> 'itertools' in sys.modules 
False 

tôi lưu ý rằng, itertools được mô tả như là một 'built-in' trong Python 3 sys.modules dict (<module 'itertools' (built-in)>), và không trong Python 2 vì vậy có lẽ đó là lý do tại sao nó ở trong sys.modules trước khi được nhập, nhưng nó là not listed as a built-in. Dù sao, kể từ khi itertools vẫn cần nhập khẩu trong Python 3, tôi sẽ biết ơn cho một lời giải thích.

+4

Nếu bất kỳ mô-đun nào bạn đã * đã nhập * cần nhập mô-đun của riêng chúng, các mô-đun đó sẽ hiển thị là đã tải. Có lẽ một sự phụ thuộc đã được giới thiệu trong Python 3 không tồn tại trong Python 2. P.S. ngay cả khi một mô-đun được tải, bạn cần phải 'nhập' mô đun đó để làm cho nó có sẵn trong phạm vi hiện tại. –

+1

Tôi nghĩ bạn đã tự trả lời câu hỏi: nếu 'itertools' đã trở thành nội trang, nó sẽ được tải ngay khi khởi động trình thông dịch. – ForceBru

+0

là câu hỏi tại sao 'itertools' cần nhập hoặc tại sao nó lại ở đó và không được liệt kê như vậy trong tài liệu? –

Trả lời

7

Họ được nhập, không phải do bạn. Chính xác những gì bộ phận của phiên dịch khởi động gây ra các mô-đun được nạp là chi tiết thực hiện không quan trọng, nhưng bạn có thể theo dõi các đường dẫn có thể nếu bạn muốn. Ví dụ, itertools được nhập khẩu bởi reprlib

from itertools import islice 

được nhập khẩu bởi functools:

from reprlib import recursive_repr 

được nhập khẩu bởi types:

import functools as _functools 

được nhập khẩu bởi importlib:

import types 

được khởi động lúc khởi động phiên dịch vì đó là nơi phần lớn việc triển khai nhập là.

+0

Tuyệt vời, cảm ơn bạn vì câu trả lời có thẩm quyền. Vì vậy, trình thông dịch nhập 'itertools' (và các mô-đun khác như' os') nhưng không thêm chúng vào 'globals()' để chúng không thể truy cập được? –

+0

@Chris_Rands: Nó tuân theo các quy tắc thông thường để nhập. Nếu module 'foo' thực hiện' thanh nhập', thì việc nhập đó chỉ làm cho mô-đun 'bar' có sẵn cho mô-đun' foo'. Mọi người muốn sử dụng một mô-đun cần phải tự nhập khẩu. – user2357112

+1

và đó là lý do tại sao bạn không thể tìm thấy nó trong 'Py 2' tôi đoán, khi cơ chế nhập vẫn được thực hiện trong' C' và (rõ ràng) không gián tiếp nhập 'itertools'. –

-1

Dường như bằng Python 3, phần mở rộng itertools thực sự là biên dịch vào nhị phân Python chính không giống như Python 2. Nếu bạn làm một

import sys 

và sau đó một

'itertools' in sys.builtin_module_names 
>> True 

rõ ràng . Thực hiện các bước tương tự chính xác trong bảng điều khiển 2.x của Python dẫn đến kết quả là False.

As per the docs, builtin_module_names bao gồm các mô-đun 'được biên dịch thành thông dịch viên Python'.

+0

câu hỏi là * tại sao * nó chỉ là. –

+0

@ JimFasarakis-Hilliard Câu trả lời cho "_why là itertools trong sys.modules trước khi được nhập bằng Python 3 và không phải trong Python 2_" là "_bởi vì nó là một nội trang được chứng minh bởi sự hiện diện của nó trong' 'builtin_module_names'". – Anomitra

+2

Trong khi mô-đun này xảy ra để được biên dịch sang Python, các mô-đun đó vẫn cần phải được khởi tạo và được nạp bằng cách nhập một nơi nào đó trước khi chúng hiển thị trong 'sys.modules'. – user2357112

Các vấn đề liên quan