[Python] Import vs execfile
Alessandro Dentella
sandro a e-den.it
Mer 14 Ago 2013 08:31:09 CEST
Ciao a tutti,
ho un pezzo di codice che riporto in seguito che ha fatto un dignitosissimo
servizio per anni. Per un motivo che spiego fra poco ho voluto usare
execfile invece che import ed ottengo risultati che non comprendo.
Il codice è un pezzo di configurazione che viene letto da uno script
(sqledit) dopo avere fatto un os.chdir in una cartella dove possono esserci
uno o più file di configurazione chiamati:
models.py
layout.py
hooks.py
Ciascuno di questi file se esiste contiene la registrazione di modelli
sqlalchemy, layout o hooks, quindi un import va bene (e sta funzionando) ma
un execfile credevo andasse altrettanto bene e ci vedevo il vantaggio di non
ceare conflitti con eventuali nomi di packages.
La pazza cosa che mi sta succedendo è che l'oggetto Column importato nelle prime
righe è ancora presente prima della definizione del modello ma poi non
viene visto all'interno della classe 'Invitato':
import os
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Table, Column, ForeignKey
from sqlalchemy.types import *
from sqlalchemy.orm import relation, backref
Base = declarative_base()
#Base.metadata.bind = 'postgresql://localhost/cene'
print Column # Questa viene correttamente stampata
idbase = Column(Integer, primary_key=True) # OK
class Invitato(Base):
__tablename__ = 'cena_invitato'
id = Column(Integer, primary_key=True)
nome = Column(String(60), nullable=False)
invito_id = Column(ForeignKey('cena_invito.id'), nullable=False)
...
L'errore sollevato quando eseguo questo codice è:
Traceback (most recent call last):
File "/usr/local/bin/sqledit", line 436, in <module>
main()
File "/usr/local/bin/sqledit", line 413, in main
program()
File "/usr/local/bin/sqledit", line 363, in program
open_db()
File "/usr/local/bin/sqledit", line 290, in open_db
execfile('models.py', )
File "models.py", line 20, in <module>
class Invitato(object):
File "models.py", line 22, in Invitato
id = Column(Integer, primary_key=True)
NameError: name 'Column' is not defined
Ma se per prova eseguo il file da riga di comando, non ho errori:
sandro a bluff:~/.sqledit/cene$ python -c 'execfile("models.py")'
<class 'sqlalchemy.schema.Column'>
Cosa può influenzare ciò che avviene all'interno di un execfile?
In generale ho visto comportamenti così in caso di import circolari che in
questo caso posso escludere...
sandro
*:-)
--
Sandro Dentella *:-)
http://www.reteisi.org Soluzioni libere per le scuole
http://sqlkit.argolinux.org SQLkit home page - PyGTK/python/sqlalchemy
Maggiori informazioni sulla lista
Python