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
在 __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?
我知道有很多这样的问题,我试着把它们都读完了。我正在做的是使用多处理库通过 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
在 __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?