导入模块出错,NameError:全局名称'module'未定义

3 投票
2 回答
8356 浏览
提问于 2025-04-16 12:41

抱歉,如果这个问题之前有人问过。我找了很久也没找到解决办法。

我在文件 ResourceOpen.py 中创建了一个类。

class ResourceOpen():

    import urllib.request

    def __init__(self, source):
            try:
                # Try to open URL
                page = urllib.request.urlopen(source)
                self.text = page.read().decode("utf8")
            except ValueError:
                # Fail? Print error.
                print ("Woops!  Can't find the URL.")
                self.text = ''

    def getText(self):
        return self.text

我想在另一个程序 youTubeCommentReader.py 中使用这个类……

import ResourceOpen
import urllib.request

pageToOpen = "http://www.youtube.com"
resource = ResourceOpen.ResourceOpen(pageToOpen)
text = resource.getText()

每当我尝试运行 youTubeCommentReader 时,就会出现错误:

Traceback               
    <module>    D:\myPythonProgs\youTubeCommentReader.py
    __init__    D:\myPythonProgs\ResourceOpen.py
NameError: global name 'urllib' is not defined

我哪里做错了?另外,我要说明的是,当我在同一个文件中访问这个类时,ResourceOpen.py 是可以正常工作的。

2 个回答

0

你原来的代码有个问题,就是urllib.request变成了一个类的属性,这样在你的__init__方法里就得用self.urllib.request.urlopen(...)来调用它。其实,import语句放在模块的最上面会更好。

5

不要在类的层级上导入,只需这样做:

import urllib.request

class ResourceOpen():    

    def __init__(self, source):
            try:
                # Try to open URL
                page = urllib.request.urlopen(source)
                self.text = page.read().decode("utf8")
            except ValueError:
                # Fail? Print error.
                print ("Woops!  Can't find the URL.")
                self.text = ''

    def getText(self):
        return self.text

在另一个脚本中:

import ResourceOpen
s = ResourceOpen.ResourceOpen('http://google.com')
print(s.getText())

在你的情况下,模块导入得很好,但它只被添加到了类的命名空间中。你总是希望在全局层面上进行导入。

撰写回答