Python多重处理使用argparse和pyinstaller引发错误

Pra*_*hra 2 python pyinstaller python-2.7 argparse python-multiprocessing

在我的项目中,我使用argprse传递参数,而在脚本中的某个地方使用多重处理来完成其余的计算。如果我从命令提示符处调用脚本,则脚本工作正常。

python complete_script.py --arg1=xy --arg2=yz”。

但是在使用Pyinstaller使用命令“ pyinstaller --onefile complete_script.py”将其转换为exe后,它将抛出

错误

“错误:无法识别的参数:--multiprocessing-fork 1448”

任何建议,我如何使这项工作。或任何其他选择。我的目标是创建一个exe应用程序,可以在未安装Python的其他系统中调用该应用程序。

以下是我的工作站的详细信息:

Platform: Windows 10
Python : 2.7.13 <installed using Anaconda>
multiprocessing : 0.70a1
argparse:   1.1
Run Code Online (Sandbox Code Playgroud)

从评论中复制:

def main():
     main_parser = argparse.ArgumentParser()
     < added up arguments here>
    all_inputs = main_parser.parse_args()
    wrap_function(all_inputs)


def wrap_function(all_inputs):
    <Some calculation here >
   distribute_function(<input array for multiprocessing>)

def distribute_function(<input array>):
    pool = Pool(process = cpu_count)
    jobs = [pool.apply_async(target_functions, args = (i,) for i in input_array)]
    pool.close()
Run Code Online (Sandbox Code Playgroud)

san*_*nzo 5

(有点晚,但将来对其他人可能有用...)

经过研究后,我遇到了同样的问题,发现此多处理pyInstaller配方指出:

使用多处理模块时,必须调用

multiprocessing.freeze_support()

if __name__ == '__main__':在主模块的直线之后。

请阅读有关multiprocessing.freeze_support 的Python库手册,以获取更多信息。

添加那行代码为我解决了这个问题。


hpa*_*ulj 0

我可能正在解释显而易见的事情,但你没有给我们提供太多可以使用的信息。

python complete_script.py --arg1=xy --arg2=yz
Run Code Online (Sandbox Code Playgroud)

这种调用告诉我,您的parser设置至少接受这两个参数,其中标有“--arg1”和“--arg2”。

该错误告诉我这个解析器(或者可能是其他解析器)也看到了这个字符串:

--multiprocessing-fork 1448
Run Code Online (Sandbox Code Playgroud)

可能由多处理代码生成。最好能看到usage错​​误的部分,只是为了确认哪个解析器在抱怨。

我对 Python 的第一个开源贡献之一是增强有关 Windows 上多处理的警告。

https://docs.python.org/2/library/multiprocessing.html#windows

您的解析器是否受if __name__块保护?在 fork 中运行时是否应该调用这个特定的解析器?您可能将解析器设计为在程序作为独立脚本调用时工作。但是导入的时候会发生什么情况呢?