Проблема с импортом модуля и NameError: глобальное имя «модуль» не определено - PullRequest
3 голосов
/ 28 февраля 2011

Извините, если этот вопрос был задан ранее. Я долго осматривался и не нашел решения.

Итак, я создал класс в файле 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 ]

5 голосов
/ 28 февраля 2011

Не импортируйте на уровне класса, просто сделайте:

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

В вашем случае модуль импортируется просто отлично, но только добавляется в пространство имен классов. Вы всегда хотите импортировать на глобальном уровне.

0 голосов
/ 07 октября 2011

Проблема с вашим исходным кодом в том, что urllib.request в конечном итоге является атрибутом класса, поэтому вам нужно будет сказать self.urllib.request.urlopen(...) в вашем __init__.import гораздо лучше на уровне модулей.

...