【问题标题】:How do I use “if __name__ == '__main__':” in a .bat file?如何在 .bat 文件中使用“if __name__ == '__main__':”?
【发布时间】:2020-05-16 14:34:53
【问题描述】:

我有一个在 Spyder 中运行良好的多处理函数,如下所示:

if __name__ == '__main__':
    global results
    p = Pool(20)
    results = p.map(get_api_item, date_list)
    p.terminate()
    p.join()

result = pd.concat(results)

path = r'<path>'
result.to_csv(os.path.join(path,r'api_item.csv'), index=False)

当我在 .bat 文件中运行该 .py 文件时...

@echo off
"E:\Python\Anaconda3\python.exe" "E:\Projects\api.py" %*
pause

...我收到此错误:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "E:\Python\Anaconda3\lib\multiprocessing\spawn.py", line 105, in spawn_ma
in
    exitcode = _main(fd)
  File "E:\Python\Anaconda3\lib\multiprocessing\spawn.py", line 114, in _main
    prepare(preparation_data)
  File "E:\Python\Anaconda3\lib\multiprocessing\spawn.py", line 225, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "E:\Python\Anaconda3\lib\multiprocessing\spawn.py", line 277, in _fixup_m
ain_from_path
    run_name="__mp_main__")
  File "E:\Python\Anaconda3\lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "E:\Python\Anaconda3\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "E:\Python\Anaconda3\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "<path to api>\api.py", line 29, in <module>
    result = pd.concat(results)
NameError: name 'results' is not defined

我认为这是因为服务(.bat 文件)可能不会调用它__main__。我该如何补救?

【问题讨论】:

  • 删除 global 后会发生什么?
  • “主要”代码除了还有什么?依赖于该块的所有内容都应该在同一个块中。
  • 你没有给我们错误result = pd.concat(results)中的代码...
  • 我认为您不想要全局变量,而 pd.concat 业务正在依赖它。 :-)
  • .BAT 文件完全无关。您所有的批处理文件正在执行 python。错误来自 python,而不是批处理文件。

标签: python python-3.x batch-file multiprocessing main


【解决方案1】:

请阅读并理解 mutiprocessing 文档 (https://docs.python.org/3.8/library/multiprocessing.html) 中的警告:

主模块的安全导入

确保新的 Python 解释器可以安全地导入主模块,而不会导致意外的副作用(例如 开始一个新进程)。

您的模块将由其他进程导入,因此您不能拥有全局(最外层)级别的代码,具体取决于您的 __main__ 块中的代码。

【讨论】:

    猜你喜欢
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    相关资源
    最近更新 更多