导入模块和名称时出现问题错误:未定义全局名称“module”

2024-05-20 21:28:45 发布

您现在位置:Python中文网/ 问答频道 /正文

对不起,如果这个问题以前被问过的话。我找了好一阵子都没找到解决办法。

所以我在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可以正常工作。


Tags: 文件textpyimportselfurlsourceinit
2条回答

不要在类级别导入,只需执行以下操作:

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())

在您的示例中,模块导入很好,但只添加到类命名空间中。您总是希望在全局级别上导入。

原始代码的问题是urllib.request最终成为一个类属性,因此必须在__init__中说self.urllib.request.urlopen(...)import在模块级的情况要好得多。

相关问题 更多 >