我在 Python 脚本中导入模块时遇到了一些困难。我将尽力描述该错误,为什么会遇到它,以及为什么我要使用这种特定的方法来解决我的问题(我将在稍后描述):
假设我有一个模块,在其中定义了一些实用函数/类,它们引用在将导入该辅助模块的命名空间中定义的实体(让“a”成为这样的实体):
module1:
def f():
print a
然后我有主程序,其中定义了“a”,我想将这些实用程序导入其中:
import module1
a=3
module1.f()
执行程序会触发以下错误:
Traceback (most recent call last):
File "Z:\Python\main.py", line 10, in <module>
module1.f()
File "Z:\Python\module1.py", line 3, in f
print a
NameError: global name 'a' is not defined
类似的问题也被问过过去(两天前,呃)已经提出了几种解决方案,但我并不认为这些解决方案符合我的要求。这是我的具体背景:
我正在尝试制作一个连接到 MySQL 数据库服务器并使用 GUI 显示/修改数据的 Python 程序。为了简洁起见,我在一个单独的文件中定义了一堆与 MySQL 相关的辅助/实用函数。然而它们都有一个共同的变量,这是我最初定义的inside实用程序模块,这是cursor来自 MySQLdb 模块的对象。
我后来意识到cursor对象(用于与数据库服务器通信)应该在主模块中定义,这样主模块和导入到其中的任何内容都可以访问该对象。
最终结果将是这样的:
实用程序_模块.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
我的主要模块:
程序.py:
import MySQLdb, Tkinter
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
然后,一旦我尝试调用任何实用程序函数,它就会触发上述“全局名称未定义”错误。
一个特别的建议是在实用程序文件中包含“from program import cur”语句,如下所示:
实用程序_模块.py:
from program import cur
#rest of function definitions
程序.py:
import Tkinter, MySQLdb
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
但这是循环导入或类似的东西,最重要的是,它也会崩溃。所以我的问题是:
我到底如何才能使主模块中定义的“cur”对象对导入其中的辅助函数可见?
感谢您抽出时间,如果解决方案已发布在其他地方,我深表歉意。我自己找不到答案,我的书中也没有更多的技巧。