尝试python多处理的Windows上的RuntimeError

时间:2015-03-03 11:28:48

标签: python windows multithreading multiprocessing kaggle

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

预先处理验证数据

使用gpu device 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()

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

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

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

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

RuntimeError:             尝试在当前进程之前启动新进程             已经完成了自举阶段。

        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行

1 个答案:

答案 0 :(得分:0)

在这种情况下,

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