Python, NameError: name browser is not defined

Python, NameError: name browser is not defined

我知道有很多这样的问题,我试着把它们都读完了。我正在做的是使用多处理库通过 Python Selenium 解析网页。因此,我有 3 个列表可提供给处理它们的函数。首先我写函数,然后启动浏览器istance,最后启动3个进程。

import ...

def parsing_pages(list_with_pages_to_parse):
    global browser
    #do stuff

if __name__ == '__main__':
    browser = webdriver.Chrome(..., options = ...)
    browser.get(...)

    lists_with_pages_to_parse = [ [...], [...], [...] ]
    
    pool.mp.Pool(3)
    pool.map(parsing_pages, lists_with_pages_to_parse)
    pool.close
    pool.join

错误:

NameError: name 'browser' is not defined

Traceback (most recent call last):
  File "c:\Users338\Desktop\program.py", line 323, in <module>
    pool.map(parsing_pages, lists_with_pages_to_parse)
  File "C:\Users338\AppData\Local\Programs\Python\Python310\lib\multiprocessing\pool.py", line 364, in map
    return self._map_async(func, iterable, mapstar, chunksize).get()
  File "C:\Users338\AppData\Local\Programs\Python\Python310\lib\multiprocessing\pool.py", line 771, in get
    raise self._value
NameError: name 'browser' is not defined

我使用 global 来允许在函数内部使用“浏览器”。 我以为问题是这个函数是在我创建“浏览器”之前写的,但是当我试图把它放在主要部分之后时,我得到了调用时找不到函数的错误。

第一件事:始终尽量避免使用 global 关键字。当它变得更长和复杂时,它会导致我的代码不稳定。

无论如何,您的代码说 global 未定义,因为您没有在函数范围之外定义名为 browser 的全局变量。

删除全局关键字。您不需要它,因为您将浏览器返回到函数本身。

别忘了查看这些资源:

NameError: global name 'browser' is not defined

https://python-forum.io/thread-12073.html

https://githubhot.com/repo/Matrix07ksa/Brute_Force/issues/24

https://github.com/MasonStooksbury/Free-Games/issues/41

__name__ != '__main__' 时调用此函数(来自另一个:文件、线程或进程)永远不会初始化 browser。示例:

def f():
    global browser
    browser

if __name__ == '__main__':
    browser = None

# Calling f will not raise an error
f()
def f():
    global browser
    browser

if __name__ != '__main__':
    browser = None

# Calling f will will now raise an error
f()

我认为正在发生的事情是你正在从另一个 __name__ != '__main__'.

的进程中创建 pool 和池 运行s parsing_pages()

您需要执行以下操作之一:

  • browser 作为参数传递给您的函数
  • if 语句之外初始化浏览器

您应该添加 print(__name__) 来检查它等于什么。它可能会 return 你的文件名,而不是 __main__.


问题解决后编辑:

__name__ 将等于 '__main__' 当您 运行 宁文件时没有: 线程,处理池或来自另一个文件。 当你运行它自己由于这是 运行 在多处理池中运行,因此无法满足 __name__ == '__main__'。所以条件永远不允许 browser 被初始化。

下面将对此进行更详细的讨论:

A video for easy digestion (in Python2 but that's fine)

Python Tutorial: if __name__ == '__main__' (Youtube | 8:42)

Most detailed articles (Stack Overflow)

What does if __name__ == "__main__": do?

Purpose of 'if __name__ == "__main__":'

And if you're interested

What's the point of a main function and/or __name__ == "__main__" check in Python?