我正在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文件不同的工作目录有关。排队,这是有效的。
答案 0 :(得分:6)
( Spyder dev here )如果此问题是由runfile
设置工作目录引起的,您可以通过转到菜单项来防止这种情况发生
Run > Configuration per file
(或按Ctrl+F6
)并选择名为当前工作目录的选项。
备注: