4

我在工作中在 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=1amodule.py一切正常。

更新:

所以经过进一步审查,看来这可能与spyder有关。我正在使用 spyder 2.3.8。当我让 spyder 执行时,这是一个专用窗口,它可以工作。但是当它在交互式 IPython 控制台中运行时,它会失败。我也可以直接从命令行运行程序而不会出现问题。

更新 2:

经过进一步审查,这确实与 IPython 位于与 *.py 文件不同的工作目录有关。把那些排成一行,这很有效。

4

1 回答 1

6

( Spyder dev here ) 如果这个问题是由runfile设置工作目录引起的,你可以通过进入菜单条目来防止这种情况发生

Run > Configuration per file

(或按Ctrl+F6)并选择名为The current working directory的选项。

备注

  1. 为每个文件保存运行配置,Spyder 会在重新启动后记住它。
  2. Spyder 3.2及更高版本的答案已更新。
于 2016-01-18T20:49:11.527 回答