0

我正在使用cx_freeze将我的 Python 应用程序转换为 Windows 可执行文件。我pandas-profiling在我的一个脚本中使用包。当我运行我的 exe 文件时,我收到以下错误:

    File "C:\Users\Ronnie\python3.6\Lib\site-packages\pandas_profiling\__init__.py", line 10, in <module>
    import pandas_profiling.templates as templates
  File "C:\Users\Ronnie\python3.6\Lib\site-packages\pandas_profiling\templates.py", line 64, in <module>
    row_templates_dict = {'NUM': template('row_num'),
  File "C:\Users\Ronnie\python3.6\Lib\site-packages\pandas_profiling\templates.py", line 60, in template
    return jinja2_env.get_template(templates[template_name], globals=globals)
  File "C:\Users\Ronnie\python3.6\Lib\site-packages\jinja2\environment.py", line 830, in get_template
    return self._load_template(name, self.make_globals(globals))
  File "C:\Users\Ronnie\python3.6\Lib\site-packages\jinja2\environment.py", line 804, in _load_template
    template = self.loader.load(self, name, globals)
  File "C:\Users\Ronnie\python3.6\Lib\site-packages\jinja2\loaders.py", line 113, in load
    source, filename, uptodate = self.get_source(environment, name)
  File "C:\Users\Ronnie\python3.6\Lib\site-packages\jinja2\loaders.py", line 234, in get_source
    if not self.provider.has_resource(p):
  File "C:\Users\Ronnie\python3.6\Lib\site-packages\pkg_resources\__init__.py", line 1396, in has_resource
    return self._has(self._fn(self.module_path, resource_name))
  File "C:\Users\Ronnie\python3.6\Lib\site-packages\pkg_resources\__init__.py", line 1449, in _has
    "Can't perform this operation for unregistered loader type"
NotImplementedError: Can't perform this operation for unregistered loader type

如果我将它pandas-profiling放在与 exe 文件相同的目录中然后运行它,我会收到以下错误:

 error: unrecognized arguments: --multiprocessing-fork 1448

在寻找多处理错误的解决方案时,我发现它pandas-profiling正在其中一个脚本中使用multiprocessing,并且需要multiprocessing.freeze_support()在该模块中调用,但我不知道在哪里添加它。

任何帮助,将不胜感激。

4

1 回答 1

0

引用以下文档multiprocessing.freeze_support()

需要if __name__ == '__main__'在主模块的行之后直接调用此函数。例如:

from multiprocessing import Process, freeze_support

def f():
      print('hello world!')

if __name__ == '__main__':
    freeze_support()
    Process(target=f).start()

因此,您需要在if __name__ == '__main__'使用pandas-profiling.

如果您的脚本中没有这样的行:将此行添加到脚本的第一个顶级代码行之前,并将脚本的整个顶级代码缩进,使其属于该if块。请参阅if __name__ == "__main__": 做什么?

另请参阅Python multiprocessing throws error with argparse 和 pyinstaller以及将 freeze_support() 放在 Python 脚本中的什么位置?

于 2018-12-17T12:34:14.623 回答