未在if uuu name uuu=='之后定义Python变量__主&';

未在if uuu name uuu=='之后定义Python变量__主&';,python,variables,multiprocessing,global,main,Python,Variables,Multiprocessing,Global,Main,我正试图通过使用多处理库中的池来分配查找历史股价数据中符号列表的任务 在我尝试使用我得到的数据之前,这非常有效。我定义了我的hist_price函数,并将其输出到dictpcl列表。我可以print(pcl)并且它是完美的,但是如果我尝试print(pcl)在之后,如果name\uuuuuuu==''主代码:块,它就会说pcl未定义。我试过在几个地方声明global pcl,但没有什么不同 from multiprocessing import Pool syms = ['List', 'of

我正试图通过使用
多处理库中的
来分配查找历史股价数据中符号列表的任务

在我尝试使用我得到的数据之前,这非常有效。我定义了我的
hist_price
函数,并将其输出到dict
pcl
列表。我可以
print(pcl)
并且它是完美的,但是如果我尝试
print(pcl)
之后,如果
name\uuuuuuu==''主代码:
块,它就会说
pcl
未定义。我试过在几个地方声明
global pcl
,但没有什么不同

from multiprocessing import Pool

syms = ['List', 'of', 'symbols']

def hist_price(sym):
    #... lots of code looking up data, calculations, building dicts...
    stlh = {"Sym": sym, "10D Max": pcmax, "10D Min": pcmin} #simplified
    return stlh

#global pcl
if __name__ == '__main__':
    pool = Pool(4)
    #global pcl
    pcl = pool.map(hist_price, syms)
    print(pcl) #this works
    pool.close() 
    pool.join()

print(pcl) #says pcl is undefined

#...rest of my code, dependent on pcl...

我也尝试过删除
if\uuuuu name\uuuu=='\uuuu main\uuuu':
块,但它给了我一个运行时错误,告诉我具体地把它放回去。是否有其他方法调用
if
块外部使用的变量

我认为你的问题有两部分。第一个问题是“当前代码中的
pcl
有什么问题?”,第二个问题是“如果uuu name\uuuuu==“\uuuu main\uuuuu”
保护块,为什么我需要
呢?”

让我们按顺序来处理它们。
pcl
变量的问题在于,它仅在
if
块中定义,因此如果模块在加载时没有作为脚本运行(这是设置
\uuuu name\uuuuuu==“\uuuu main\uuuu”
),则在以后的代码运行时不会定义它

要解决这个问题,您可以更改代码的结构。最简单的修复方法是保护
中使用
pcl
的代码的其他位,如果也使用
块(例如,将它们全部缩进当前块)。另一种修复方法是将使用
pcl
的代码放入函数中(可以在保护块之外声明),然后从
中调用函数,如果
块中的
名为。看起来是这样的:

def do_stuff_with_pcl(pcl):
    print(pcl)

if __name__ == "__main__":
    # multiprocessing code, etc
    pcl = ...
    do_stuff_with_pcl(pcl)
至于为什么首先出现这个问题,最终的原因是在Windows上使用了
多处理
模块。您可以在中阅读有关该问题的信息

当多处理为其
池创建新进程时,它需要使用当前模块状态的副本初始化该进程。因为Windows没有
fork
(它会自动将父进程的内存复制到子进程中),所以Python需要从头开始设置一切。在每个子进程中,它从其文件中加载模块,如果模块的顶级代码尝试创建一个新的
,则会出现一种递归情况,其中每个子进程都会开始生成自己的一组全新子进程


我认为,
multiprocessing
代码有一些防范措施(因此你不会因为简单的粗心而放弃自己),但是你仍然需要自己做一些工作,使用
if\uuuuuu name\uuuu==“\uuuuu main\uuuuu”
保护任何不应该在子进程中运行的代码。

如果您是从终端运行脚本或其他原因,那么是否有
if\uuuuuu name\uuuuuuu==''uuuuu main\uuuuuuuu':
。@MosesKoledoye可能是因为OP使用了多处理。@poke oh Ok。显然是这样。这个过程在我的代码开始时运行,其余部分依赖于
pcl
。如果我能帮上忙的话,我希望避免将其余代码全部放在
if
块中。我曾尝试在
if
块之外声明
pcl
(带和不带
global
),但它似乎仍将其视为两个单独的实例。@wampthing2:我已更新了我的答案,以更深入地了解问题所在的背景以及如何解决问题的更多细节。排序:不要在顶层做太多的事情,因为如果
,你需要用
来保护它。