为什么这在Python IDLE shell中有效,但在我从命令提示符下作为Python脚本运行时却没有?

时间:2013-07-09 20:04:12

标签: python python-3.x

这适用于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”的简单文本文件

Inside 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 个答案:

答案 0 :(得分:11)

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

<强>演示:

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

这是因为此顺序为module is searched

  • 包含输入脚本(或当前目录)的目录。
  • PYTHONPATH(目录名列表,语法与 shell变量PATH)。
  • 依赖于安装的默认值。

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

答案 1 :(得分:2)

正如@Sukrit Kalra所说,不要使用datetime.py作为您的文件名。 Python正在与哪个datetime混淆(并且正在导入自己!)。也许;

 $ mv datetime.py my_datetime.py

答案 2 :(得分:2)

切勿使用与模块名称相同的文件名。将文件名更改为datetime.py以外的其他内容。

答案 3 :(得分:0)

命名文件datetime会导致Python导入您作为模块运行的文件。例如,请查看sys.path。例如,我的是['', '/usr/lib/python3.3', ...],这意味着Python在模块的当前工作目录('')中看起来是FIRST。并且因为以.py结尾的任何内容都可以作为模块导入,它会导入您实际运行的脚本(如果我没有弄错,实际上会导致它运行两次,一次为__main__并且曾经作为模块)。