我在工作中在 Windows Server 2013 上运行 Python 3.5.1。我有一些令人尴尬的并行任务,它们似乎可以在 Python 2.7 上使用基本相同的代码,但我无法弄清楚如何让它在 Python 3.5.1 上运行。
我正在使用 Anaconda 2.4.1
代码看起来像这样......我已经把它精简到了最低限度。
\
->main.py
\apackage\
->__init__.py
->amodule.py
代码main.py
from tpackage import AClass
def go():
x = AClass().AFunction()
return x
if __name__ == '__main__':
x = go()
print(x)
代码__init__.py
from .amodule import AClass
__all__ = ['AClass']
代码amodule.py
from joblib import Parallel, delayed
class AClass(object):
def AFunction(self):
x = Parallel(n_jobs=2,verbose=100)(
delayed(add1)(i) for i in range(10)
)
return x
def add1(x):
return x + 1
这与声明的必要性有什么关系if __name__ == '__main__':
吗?我认为我不需要这个,因为它已经在语句Parallel
中受到保护,并且应该只在调用模块时运行,这应该只发生一次。def
__main__
我应该补充一点,如果我改变n_jobs=1
,amodule.py
一切正常。
更新:
所以经过进一步审查,看来这可能与spyder有关。我正在使用 spyder 2.3.8。当我让 spyder 执行时,这是一个专用窗口,它可以工作。但是当它在交互式 IPython 控制台中运行时,它会失败。我也可以直接从命令行运行程序而不会出现问题。
更新 2:
经过进一步审查,这确实与 IPython 位于与 *.py 文件不同的工作目录有关。把那些排成一行,这很有效。