Python 使用脚本在空闲状态下设置变量
在Win7 x64上使用Python 3.2。我有一个脚本,我想在每次启动空闲时运行它。这是我的剧本:Python 使用脚本在空闲状态下设置变量,python,python-3.x,beautifulsoup,python-idle,Python,Python 3.x,Beautifulsoup,Python Idle,在Win7 x64上使用Python 3.2。我有一个脚本,我想在每次启动空闲时运行它。这是我的剧本: import sys from bs4 import BeautifulSoup sys.setrecursionlimit(2000) soup = BeautifulSoup() def soupSetup(file_name, encode_type): soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".
import sys
from bs4 import BeautifulSoup
sys.setrecursionlimit(2000)
soup = BeautifulSoup()
def soupSetup(file_name, encode_type):
soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))
这样,一切都设置好了,我所要做的就是传递我想要使用的html文件,然后开始处理数据
我的问题是,如果我像使用print(soup.prettify())
时那样使用代码,则只会返回一个空行。如果我在运行print语句时没有首先实例化该类,我会得到:
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
print(soup.prettify())
NameError: name 'soup' is not defined
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
打印(soup.prettify())
NameError:未定义名称“soup”
对于那些不熟悉BeautifulSoup的人来说,它是
的一个例子
如何使soup对象在脚本之外持久化?您可以使用语句
soup=beautifulsou()
创建模块的全局名称soup
。然后,在函数soupSetup
中,您希望将soup
名称重新分配给另一个BeautifulSoup()
对象,这次是数据
但是:函数内的名称是该函数的局部名称,不会在该函数外持久存在。因此,您最终不会重新分配全局soup
名称,而是在函数中创建一个新的独立soup
变量,该变量在函数存在时将被删除。全局汤未被更改。这就是为什么在使用soup
变量时,首先创建的BeatifulSoup()对象是空的
您需要做的是告诉函数您要重新分配全局名称,如下所示:
def soupSetup(file_name, encode_type):
global soup
soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))
应该这样做。
另外,您不必设置soup=BeautifulSoup()
,将其设置为什么并不重要,因为它将被函数覆盖。只需这样做:
soup = None
然后,完整代码应以以下形式结束:
import sys
from bs4 import BeautifulSoup
sys.setrecursionlimit(2000)
soup = None
def soupSetup(file_name, encode_type):
global soup
soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))
看起来是两个问题合一
关于启动时要执行的代码的第一个问题是通过根据在某个目录中创建模块usercustomize/sitecustomize来解决的
现在,第二个问题可以通过扩充\uuuuuuu内置
来解决:
import __builtin__
setattr(__builtin__, 'soup', soup)
在启动模块上(在适当的位置),然后汤将神奇地在其他地方可用。我不建议这样做,你可能需要重新思考你想要实现什么。此外,在当前的方法中,您在soupSetup
中重新定义了soup
。因此,在该函数中,您需要指定重新定义全局变量,而不是创建局部变量:
def soupSetup(...):
global soup
...
看起来是两个问题合一。关于启动时要执行的代码的第一个问题是通过根据在某个目录中创建模块usercustomize/sitecustomize来解决的。现在,第二个问题可以通过增加\uuuuuuuuuuuuuuuuuuuu
来解决:import\uuuuuuuuuuuuuu;启动模块上的setattr(uuu内置uuuu,'soup',soup)
,然后soup
将神奇地在其他任何地方可用。我不建议这样做,你可能需要重新思考你想要实现什么。此外,在正确的方法中,您需要重新定义全局汤。。。因为它完全回答了他的问题……这真的没有抓住要点。他得到了一个namererror
异常。@mmgp:如果他没有,如他所说的“首先实例化类”,即跳过模块级soup=beautifulsou()
语句,他才会得到namererror异常。即使在重读之后,我也很有信心我没有错过任何一点。我真的认为你误解了他的想法。他有一些应该在他开始空闲时运行的代码。现在代码已经运行,他尝试使用名称soup
,但是找不到它,因为它是在已经运行的代码中单独定义的。@mmgp:不,他不是这样写的。你没有仔细阅读这个问题。他明确指出,“如果我像使用print(soup.prettify())时那样使用代码,我只会得到一个空行。”。他可以访问soup
,但他实例化全局对象的是空的BeautifulSoup()对象。请参阅:“如何使soup对象在脚本之外持久化?”这一可怕的攻击可能会解决问题,但在这种情况下,这不是正确的解决方案,因为他的问题是他希望在函数中更新一个全局变量,而这是不可能的。请解释一下这个答案如何不处理全局变量的更新?这个问题是间接针对这个黑客提出的,因为他想进一步导出globalsoup
。他已经可以访问globalsoup
。“如果我像使用print(soup.prettify())时那样使用代码,我只会得到一个空行。”你需要仔细地重新阅读这个问题。如果他说他想在给定函数之外继续使用soup
,我将毫不怀疑,因为这是完全不同的。好吧,你是新来的,所以我要解释一下:当一个Python新手进来解释他想做什么时,他经常是错的,因为他是一个新手,误解了一些东西或者使用了错误的术语。这里就是这样。从他对错误的描述可以完全清楚地看出,soup
确实“在脚本之外持续存在”。因此,当他说他希望soup
在脚本之外继续存在时,他误解了正在发生的事情。既然你听了他不正确的分析,你也听了。另一方面,我仔细阅读了他的问题。你应该这样做。