[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