我在导入 Python 脚本中的模块时遇到了一些困难。我会尽力描述这个错误,为什么我会遇到它,以及为什么我要用这个特殊的方法来解决我的问题(我将在下面描述) :
假设我有一个模块,其中定义了一些实用函数/类,这些函数/类引用了名称空间中定义的实体,这个辅助模块将被导入到这个名称空间中(假设“ a”是这样一个实体) :
单元1:
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
在过去(两天前,d’uh)也有人问过类似的问题,也有人提出了一些解决方案,但我并不认为这些方案真的符合我的要求。以下是我的特殊背景:
我正在尝试制作一个 Python 程序,它可以连接到 MySQL 数据库服务器,并用 GUI 显示/修改数据。为了简洁起见,我在一个单独的文件中定义了一组辅助/实用 MySQL 相关函数。但是它们都有一个公共变量,我最初定义的是 在里面实用程序模块,它是来自 MySQLdb 模块的 光标对象。 后来我意识到 光标对象(用于与数据库服务器通信)应该在 main 模块 < strong > 中定义,这样主模块和导入到它的任何东西都可以访问该对象。
最终结果会是这样的:
Utilities _ module. 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”语句,例如:
Utilities _ module. 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”对象(定义在主模块中)对导入到其中的辅助函数可见?
感谢您的时间和我最深切的道歉,如果解决方案已被张贴在其他地方。我只是自己找不到答案,我的书里也没有更多的把戏了。