2013-07-09 12 views
6

Questo funziona in Python 3.3.2 ShellPerché questo funziona nella shell IDLE di Python ma non quando lo eseguo come script Python dal prompt dei comandi?

All'interno del Python 3.3.2 Shell

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

Che bello! Ho quindi scritto un semplice file di testo denominato "datetime.py"

All'interno 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 

Dimostrando che il file esista

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 

Qui è dove ottiene misteriosa!

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' 

Domanda

Perché lo stesso lavoro di codice in Python Shell, ma non quando viene eseguito come uno script?

+8

Provare a cambiare il nome del file con qualcos'altro. –

+0

* Mai * utilizzare i nomi dei built-in. Questo vale sia per i nomi di file che per i nomi di classi/funzioni/identificatori. Come hai già provato a non seguire questo consiglio * creerà problemi. – Bakuriu

risposta

11

Il problema è che file in modo ricorsivo stessa ha importato, invece di importare il modulo incorporato datetime:

Demo:

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

Ciò accade perché il module is searched in questo ordine :

  • la directory contenente lo script di input (o la directory corrente).
  • PYTHONPATH (un elenco di nomi di directory, con la stessa sintassi della variabile di shell PATH).
  • predefinito di installazione.

Basta cambiare il nome di datetime.py in qualcos'altro.

+0

Grazie per aver spiegato PERCHE 'stava succedendo! – Rentsy

2

Come dice @Sukrit Kalra, non utilizzare datetime.py come nome file. Python si sta confondendo con il quale datetime è (e si sta importando!). Può essere;

$ mv datetime.py my_datetime.py 
1

Non utilizzare mai nomi di file uguali ai nomi dei moduli. Cambia nome file in qualcos'altro oltre a datetime.py.

0

Assegnare un nome al file datetime fa in modo che Python importi il ​​file in esecuzione come modulo. Ad esempio, guarda sys.path. Il mio, ad esempio, è ['', '/usr/lib/python3.3', ...], il che significa che Python sembra PRIMO nella directory di lavoro corrente (il '') per i moduli. E poiché tutto ciò che finisce in .py può essere importato come modulo, importa lo script che stai effettivamente eseguendo (che, se non sbaglio, lo fa in realtà eseguire due volte, una volta come __main__ e una volta come modulo).

Problemi correlati