2013-07-09 18 views
6

này hoạt động trong Python 3.3.2 ShellTại sao điều này làm việc trong vỏ IDLE Python nhưng không phải khi tôi chạy nó như là một kịch bản Python từ dấu nhắc lệnh?

Bên trong Python 3.3.2 Shell

>>> import datetime 
>>> print(datetime.datetime.utcnow()) 
2013-07-09 19:40:32.532341 

Đó là tuyệt vời! sau đó tôi đã viết một tập tin văn bản đơn giản có tên là "datetime.py"

Bên Datetime.py

#Date time 
import datetime 
print(datetime.datetime.utcnow()) 
#Prints GMT, which is named Universal Coordinated Time 
# Which is UTC because in French it's something like 
# Universahl Tyme Coordinatay 
#Outputs something like 2013-07-09 15:15:19.695531 

Chứng minh rằng tập tin tồn tại

C:\Python33\myscripts>ls 
__pycache__ ex1.out ex2.out ex3.py helloworld.py    read1.py 
datetime.py ex1.py ex2.py first.py pythonintoimportexport.py test.py 

Đây là nơi nó được bí ẩn!

C:\Python33\myscripts>python datetime.py 
Traceback (most recent call last): 
    File "datetime.py", line 2, in <module> 
    import datetime 
    File "C:\Python33\myscripts\datetime.py", line 3, in <module> 
    print(datetime.datetime.utcnow()) 
AttributeError: 'module' object has no attribute 'utcnow' 

Câu hỏi

Tại sao công việc cùng một mã trong Python Shell, nhưng không phải khi chạy như một kịch bản?

+8

Hãy thử thay đổi tên tệp của bạn thành tên khác. –

+0

* Không bao giờ * sử dụng tên được tích hợp sẵn. Điều này đúng đối với cả hai tên tệp nhưng cũng cho tên lớp/hàm/tên định danh. Như bạn đã trải qua không theo lời khuyên này * sẽ * tạo ra vấn đề. – Bakuriu

Trả lời

11

Vấn đề là tập tin được đệ quy nhập khẩu riêng của mình, thay vì nhập khẩu được xây dựng trong mô-đun datetime:

Demo:

$ cat datetime.py 
import datetime 
print datetime.__file__ 
$ python datetime.py 
/home/monty/py/datetime.pyc 
/home/monty/py/datetime.pyc 

Điều này xảy ra bởi vì module is searched theo thứ tự này :

  • thư mục chứa tập lệnh nhập (hoặc thư mục hiện tại).
  • PYTHONPATH (danh sách tên thư mục, có cùng cú pháp với biến số P2) .
  • cài đặt mặc định phụ thuộc.

Chỉ cần thay đổi tên datetime.py thành thứ khác.

+0

Cảm ơn bạn đã giải thích tại sao điều đó xảy ra! – Rentsy

2

Như @Sukrit Kalra cho biết, không sử dụng datetime.py làm tên tệp của bạn. Python bị nhầm lẫn với datetime là (và đang tự nhập!). Có lẽ;

$ mv datetime.py my_datetime.py 
1

Không bao giờ sử dụng tên tệp giống như tên mô-đun. Đổi tên tệp thành tên khác ngoài datetime.py.

0

Đặt tên tệp datetime làm cho Python nhập tệp bạn đang chạy làm mô-đun. Ví dụ: xem sys.path. Ví dụ, tôi là ['', '/usr/lib/python3.3', ...], có nghĩa là Python tìm FIRST trong thư mục làm việc hiện tại ('') cho các mô-đun. Và bởi vì bất kỳ thứ gì kết thúc bằng .py đều có thể được nhập dưới dạng mô-đun, nó nhập tập lệnh mà bạn thực sự đang chạy (nếu tôi không nhầm, thực sự khiến nó chạy hai lần, một lần là __main__ và một lần là mô-đun).

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