windows 尝试 python 多处理时出现运行时错误

RuntimeError on windows trying python multiprocessing

我将转储我在尝试 python 脚本时得到的错误代码:

预先预处理验证数据

使用GPU设备0:Tesla K20c

Traceback (most recent call last):

File "<string>", line 1, in <module>

File "C:\SciSoft\WinPython-64bit-2.7.6.4\python-2.7.6.amd64\lib\multiprocessing\forking.py", line 380, in main prepare(preparation_data)

File "C:\SciSoft\WinPython-64bit-2.7.6.4\python-2.7.6.amd64\lib\multiprocessing\forking.py", line 495, in prepare '__parents_main__', file, path_name, etc

File "C:\Users\Administrator\Desktop\Galaxy Data\kaggle-galaxies-master\kaggle-galaxies-master\try_convnet_cc_multirotflip_3x69r45_maxout2048_extradense.py", line 133, in <module>

for data, length in create_valid_gen():

File "load_data.py", line 572, in buffered_gen_mp process.start()

`文件 "C:\SciSoft\WinPython-64bit-2.7.6.4\python-2.7.6.amd64\lib\multiprocessing\process.py",第 130 行,开始 self._popen = Popen(self)

文件 "C:\SciSoft\WinPython-64bit-2.7.6.4\python-2.7.6.amd64\lib\multiprocessing\forking.py",第 258 行,在 init 中 cmd = get_command_line() + [rhandle]

文件 "C:\SciSoft\WinPython-64bit-2.7.6.4\python-2.7.6.amd64\lib\multiprocessing\forking.py",第 358 行,在 get_command_line`

is not going to be frozen to produce a Windows executable.''')

运行时错误: 尝试在当前进程之前启动一个新进程 已完成引导阶段。

        This probably means that you are on Windows and you have
        forgotten to use the proper idiom in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce a Windows executable.

据我所知,我必须插入一行

if __name__ == '__main__':

一些让它工作的地方

谁能告诉我应该将它插入到哪个文件中?我已将受影响的文件列表包含在初始错误日志中

受影响的文件:

https://github.com/benanne/kaggle-galaxies/blob/master/try_convnet_cc_multirotflip_3x69r45_maxout2048_extradense.py

第 131-134 行

https://github.com/benanne/kaggle-galaxies/blob/master/load_data.py

第 572 行

Python documentation在这种情况下很清楚。
重要的部分是Safe importing of main module

您的 try_convnet_cc_multirotflip_3x69r45_maxout2048_extradense.py 脚本在模块级别做了很多事情。无需详细阅读,我已经可以说你应该用一个函数包装工作流并像这样使用它:

if __name__ == '__main__':
    freeze_support() # Optional under circumstances described in docs
    your_workflow_function()

除了您遇到的问题之外,如果用户只是想导入它并重用它的某些功能,那么不要让可能使用您的脚本的用户感到惊讶是一个好习惯。
所以不要将您的代码放在模块级别。在模块级别有常量是可以的,但工作流应该在函数中并且 类.
如果 Python 模块打算用作脚本(就像您的情况一样),您只需将 if __name__ == '__main__' 放在该模块的最后,仅当模块是时才调用 your_workflow_function()解释器的入口点 - 所谓的 main module.