5

这适用于 Python 3.3.2 Shell

Python 3.3.2 Shell 内部

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

那太棒了!然后我写了一个名为“datetime.py”的简单文本文件

在 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

证明文件存在

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

这就是它变得神秘的地方!

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'

问题

为什么相同的代码在 Python Shell 中有效,但在作为脚本运行时无效?

4

4 回答 4

11

问题是文件递归地导入自身,而不是导入内置模块datetime

演示:

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

发生这种情况是因为按以下顺序搜索模块:

  • 包含输入脚本的目录(或当前目录)。
  • PYTHONPATH(目录名称列表,与 shell 变量 PATH 具有相同的语法)。
  • 安装相关的默认值。

只需将名称更改为datetime.py其他名称。

于 2013-07-09T20:07:16.137 回答
2

正如@Sukrit Kalra 所说,不要datetime.py用作您的文件名。Python 对哪个datetime是哪个(并且正在导入自己!)感到困惑。也许;

 $ mv datetime.py my_datetime.py
于 2013-07-09T20:06:50.107 回答
2

切勿使用与模块名称相同的文件名。将文件名更改为除datetime.py.

于 2013-07-09T20:07:25.490 回答
0

命名您的文件datetime会导致 Python 将您正在运行的文件作为模块导入。例如,查看sys.path. 例如,我的 is ['', '/usr/lib/python3.3', ...],这意味着 Python 在''模块的当前工作目录 (the ) 中首先查找。而且因为任何以 .py 结尾的东西都可以作为模块导入,它会导入您实际运行的脚本(如果我没记错的话,实际上会导致它运行两次,一次作为模块运行,一次作为__main__模块运行) )。

于 2013-07-09T20:08:29.460 回答