我在使用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模块中的游标对象。后来我意识到,游标对象(用于与db服务器通信的对象)应该在主模块中定义,以便主模块和导入到其中的所有对象都可以访问该对象。
最终结果将是这样的:
utilities_module.py:
def utility_1(args):
code which references a variable named "cur"
def utility_n(args):
etcetera
而我的主要模块:
program.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
program.py:
import Tkinter, MySQLdb
db=MySQLdb.connect(#blahblah) ; cur=db.cursor() #cur is defined!
from utilities_module import *
但这是循环导入或类似的操作,最重要的是,它也崩溃了。所以我的问题是:
我该如何在主模块中定义的“ cur”对象对导入到其中的辅助功能可见?
如果您将解决方案发布在其他位置,则感谢您的宝贵时间和最深切的歉意。我只是自己找不到答案,而且我的书中没有其他花招。
db
(和cur
,如果你坚持)到一个独立的模块,这两个program
并utilities_module
从导入。这样一来,您就不会得到循环依赖(从要导入程序的模块中导入程序)和随之而来的混乱。
fetch_all
遍历两个列表,或者这样,只要您使用两个数据库就可以拥有两个不同的线程/ greenlet /回调链/而不会发生冲突)。