免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4618 | 回复: 4
打印 上一主题 下一主题

为什么把写的类当作单独的模块文件导入时就出现global not defined错误?不分离时没错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-08 15:49 |只看该作者 |倒序浏览
本帖最后由 oatt 于 2010-09-08 16:04 编辑

采用win32com写了一个操作EXCEL的类,当把这个类和程序主体放在一个文件里时,可以正确运行,
当初是类和程序主体部分放在一起的,运行起来没问题。
可是现在程序越来越长,并且不同的任务还要重写程序,想把类单列出来,每次import就可以了,不用每个程序里都放老长一段类的代码。

但是当把这个类单独放入一个文件,当作模块来导入时,就提示错误如下:
环境是activepython2.5.2。
  1.     >>> Traceback (most recent call last):
  2.   File "C:\Python25\Lib\SITE-P~1\PYTHON~1\pywin\framework\scriptutils.py", line 310, in RunScript
  3.     exec codeObject in __main__.__dict__
  4.   File "F:\ccrf\kit\cr\excel_test.py", line 6, in <module>
  5.     sour=excel_op.xml(targetfile)
  6.   File "F:\ccrf\kit\cr\excel_op.py", line 3, in __init__
  7.     print 'book name %s'%(self.xmlBookName)
  8. NameError: global name 'win32com' is not defined
  9. >>>
复制代码
文件是:excel_test.py
  1. if __name__=="__main__":
  2.     import win32com.client  
  3.     import excel_op

  4.     targetfile='region_total.xls'
  5.     sour=excel_op.xml(targetfile)           
  6.     sour.xmlApp.Visible=1


  7.     print sour.getCell('1',1,1)
复制代码
写的类是:excel_op.py
xml类中到init时就提示global win32com not defined 错误。
当把excel_op.py的内容复制到excel_test.py后,可以执行。

搞不明白这是为什么?曾经以为是import的位置问题,可试过后,发现不是。
  1. class xml:

  2.     def __init__(self,filename=None):
  3.         self.xmlApp=win32com.client.Dispatch('Excel.Application')
  4.         self.once = 1
  5.         if filename:
  6.             self.filename = filename
  7.             self.xmlBook=self.xmlApp.Workbooks.Open(filename)
  8.         else:
  9.             self.xmlBook=self.xmlApp.Workbooks.Add()            
  10.             self.filename=''
  11.         self.xmlBookName=self.xmlBook.name
  12.         print 'book name %s'%(self.xmlBookName)

  13.    
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-09-08 18:38 |只看该作者
package在哪个文件用到,就在哪个文件import,你这里win32com.client应该在excel_op里import

论坛徽章:
0
3 [报告]
发表于 2010-09-09 12:54 |只看该作者
不是这个问题, 试过了,和import的位置没关系.

论坛徽章:
0
4 [报告]
发表于 2010-09-09 14:55 |只看该作者
全局变量也是在一个模块的名字空间里的.
一个变量是'全局'不是说一个程序所有的模块都能直接引用它, 一个模块不能直接引用另一个模块里的全局变量, 必须间接才能引用: module_name.gvar_name.

你把那个类定义和主模块写在一个文件里, 它们在一个模块里, 类的定义里就能引用win32.com; 但你把它写到另一个文件里, 现在类在一个模块里了, 它当然不能引用win32.com这个在__main__模块里定义的全局变量了.

f1.py:
  1. g_var = 1

  2. def func():
  3.         print g_var

  4. if __name__ == '__main__':
  5.         import f2
  6.         func()
  7.         f2.func()
复制代码
f2.py:
  1. g_var = 2

  2. def func():
  3.         print g_var
复制代码
zengjie@debian:~$ python f1.py
1
2

论坛徽章:
0
5 [报告]
发表于 2010-09-10 00:33 |只看该作者
本帖最后由 oatt 于 2010-09-10 00:38 编辑

我在excel_test.py中是用
sour=excel_op.xml(targetfile)     的方式调用模块文件中的类来生成对象。
这跟你说的是一样的。

但是错误在于系统提示:win32com not defined。
win32com是系统提供的类。我在哪里都能引用的啊,再说了,执行到用类xml类初始化对象之前,我已经import win32com.client了,并且改变这名申明的地方,比如到excel_test.py的开头,到excel_op.py的开头或者xml类里面,均提示win32com not defined的错误。

所以问题还是没解决。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP