2016-06-12 18 views
6

Khi tôi làm việc với PIL, tôi phải nhập một tấn mô-đun PIL. Tôi đã thử nghiệm với ba cách để làm điều này, nhưng chỉ hoạt động người cuối cùng bất chấp tất cả đang được logic với tôi:Tại sao nhập khẩu PIL Python của tôi không hoạt động?

Nhập các PIL đầy đủ và gọi nó là module trong các mã: NOPE

>>> import PIL 
>>> image = PIL.Image.new('1', (100,100), 0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'Image' 

Nhập tất cả mọi thứ từ PIL: NOPE

>>> from PIL import * 
>>> image = Image.new('1', (100,100), 0) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'Image' is not defined 

nhập khẩu một số module từ PIL: OK

>>> from PIL import Image 
>>> image = Image.new('1', (100,100), 0) 
>>> image 
<PIL.Image.Image image mode=1 size=100x100 at 0xB6C10F30> 
>>> # works... 

Tôi không nhận được gì ở đây?

Trả lời

3

PIL không nhập bất kỳ mô-đun con nào trên riêng nó. Điều này thực sự khá phổ biến.

Vì vậy, khi bạn sử dụng from PIL import Image, bạn thực sự xác định vị trí các tập tin Image.py và nhập khẩu đó, trong khi đó khi bạn cố gắng để chỉ cần gọi PIL.Image sau import PIL, bạn đang cố gắng một tra cứu thuộc tính trên một module rỗng (vì bạn đã không nhập khẩu bất kỳ mô-đun con nào).

Lý do tương tự áp dụng cho lý do tại sao from PIL import * sẽ không hoạt động - bạn cần nhập rõ ràng biểu tượng con Hình ảnh. Trong mọi trường hợp, from ... import * được xem là hành vi xấu do sự ô nhiễm không gian tên sẽ xảy ra - đặt cược tốt nhất của bạn là sử dụng from PIL import Image.

Hơn nữa, PIL không còn được duy trì, nhưng đối với các mục đích tương thích ngược, bạn nên sử dụng from PIL import Image bạn có thể đảm bảo mã của bạn sẽ vẫn tương thích với các vẫn duy trì Pillow (như oppposed để chỉ sử dụng import Image).

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