2013-07-09 2 views
6

これは、Python 3.3.2内部のPython 3.3.2シェルでこれはPython IDLEシェルで動作しますが、コマンドプロンプトからPythonスクリプトとして実行するとどうなりますか?

を働くシェル

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

素晴らしいこと!私はそれは神秘的な取得する場所、ファイルがここ

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 

存在していることを証明する "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>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シェルでの作業が、スクリプトとして実行されません。質問?

+8

ファイル名を変更してみてください。 –

+0

*組み込み関数の名前は使用しないでください。これは、両方のファイル名に当てはまりますが、クラス/関数/識別子名にも当てはまります。あなたは既にこのアドバイスに従わないことを経験しているので、*問題を引き起こすでしょう。 – Bakuriu

答えて

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(ディレクトリ名のリスト。 シェル変数PATHと同じ構文です)。
  • インストールに依存するデフォルトです。

datetime.pyの名前を変更するだけです。

+0

どうしたのか説明していただきありがとうございます! – Rentsy

2

@Sukrit Kalraによれば、ファイル名にdatetime.pyを使用しないでください。 Pythonはどのdatetimeと混同されていますか(自分自身をインポートしています!)。多分;

$ mv datetime.py my_datetime.py 
1

モジュール名と同じファイル名は使用しないでください。ファイル名をdatetime.py以外に変更してください。

0

ファイル名をdatetimeにすると、実行中のファイルがモジュールとしてインポートされます。たとえば、sys.pathを参照してください。私の場合、例えば、['', '/usr/lib/python3.3', ...]です。つまり、Pythonはモジュールの現在の作業ディレクトリ('')でFIRSTを探します。 .pyで終わるものはモジュールとしてインポートできるので、実際に実行しているスクリプトをインポートします(私が間違っていないと、実際には2度実行されます.1度は__main__、もう1度は2度実行されます)。モジュール)。

関連する問題