global name is not defined

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Tue Nov 6 17:20:38 EST 2007


En Tue, 06 Nov 2007 18:57:12 -0300, barronmo <barronmo at gmail.com> escribió:

> I'm getting an error msg I don't understand, "global name EMR_globals
> is not defined", and could use some help.
>
> I've separated the application I'm building into several modules.  One
> of the modules holds variables I need to pass from one module to
> another and is called 'EMR_globals'.  Several other modules hold
> functions or user menus and then 'EMR_main' controls the initial user
> interaction.  I'm using MySQL to hold the data.

Global variables usually are not a good design decision, but that's not  
your current problem.

> The initial connection to the database is done by 'EMR_main'.
> Functions then define and close a cursor for various queries.  The
> connection variable, 'conn', is defined 'conn = "" ' in EMR_globals
> and then used in EMR_main.  Unfortunately when a module.function
> attempts to use it I get the error msg.

In Python, "global" means "global to the module". If conn is defined in  
EMR_globals, when you want to use it elsewhere, you can:

a)
 from EMR_globals import conn
...
cursor = conn.cursor(...)

b)
import EMR_globals
...
cursor = EMR_globals.conn.cursor(...)

Usually those import statements are placed at the top of the module.

>      cursor.execute("SELECT * FROM demographics WHERE patient_ID = %s"
> % (a,))
>      selected_pt = cursor.fetchall()
> # if this query returns more than one record the following code will
> fail I think
>      print menus.menu_demographics(selected_pt['firstname'],
> 	selected_pt['lastname'], ...

I think it will fail even with one record, because fetchall() returns a  
list of rows. Try using fetchone(). Anyway, if patient_ID is the primary  
key, you should always get a single row.

-- 
Gabriel Genellina




More information about the Python-list mailing list