Pyinstaller 可执行文件无法导入 torchvision

Posted

技术标签:

【中文标题】Pyinstaller 可执行文件无法导入 torchvision【英文标题】:Pyinstaller executable fails importing torchvision 【发布时间】:2019-10-12 23:27:11 【问题描述】:

这是我的 ma​​in.py

import torchvision
input("Press key")

在命令行中正确运行:python main.py

我需要一个适用于 Windows 的可执行文件。所以我做了:pyinstaller main.py

但是当我启动 ma​​in.exe 时,在 /dist/main 内我得到了这个错误:

Traceback (most recent call last):
  File "main.py", line 1, in <module>

  ... (omitted)

  File "site-packages\torchvision\ops\misc.py", line 135, in <module>
  File "site-packages\torchvision\ops\misc.py", line 148, in FrozenBatchNorm2d
  File "site-packages\torch\jit\__init__.py", line 850, in script_method
  File "site-packages\torch\jit\frontend.py", line 152, in get_jit_def
  File "inspect.py", line 973, in getsource
  File "inspect.py", line 955, in getsourcelines
  File "inspect.py", line 786, in findsource
OSError: could not get source code
[2836] Failed to execute script main

似乎有些源代码没有从 pyinstaller 正确导入。我不确定问题出在 torch 模块还是 torchvision

附加信息:

我最近安装了 Visual Studio 2019

系统信息:

窗口 10 Python 3.7 火炬-1.1.0 torchvision-0.3.0

[编辑]

我发现问题出在torchvision里面FrozenBatchNorm2d类的定义中。以下脚本产生与之前发布的相同的错误:

ma​​in.py

import torch

class FrozenBatchNorm2d(torch.jit.ScriptModule):

    def __init__(self, n):
        super(FrozenBatchNorm2d, self).__init__()

    @torch.jit.script_method

    def forward(self):
        pass

我复制了所有的 torch 源文件。但我仍然收到错误...

【问题讨论】:

你试过pyinstaller --hidden-import=torchvision --hidden-import=torch吗? 是的,我试过了,但没有解决问题。但是只导入torch 有效。 Torchvision 引发错误。 【参考方案1】:

猴子补丁对我不起作用,因为我在导入 torch.jit 时出错。

所以在导入 torch 之前,我在 main.py 中使用了以下解决方法:

os.environ["PYTORCH_JIT"] = "0"

显然你失去了 JIT 优化,但至少可执行文件可以工作。

【讨论】:

我花了好几个小时尝试了所有我能找到的解决这个问题的方法,包括上面的所有答案/cmets。这是唯一对我有用的东西。我意识到这不是您自己注意到的原因的完美解决方案,但它是一个解决方案。谢谢! 很高兴能帮上忙 :)【参考方案2】:

试试这个猴子补丁。

def script_method(fn, _rcb=None):
    return fn
def script(obj, optimize=True, _frames_up=0, _rcb=None):
    return obj    
import torch.jit
torch.jit.script_method = script_method 
torch.jit.script = script

【讨论】:

【参考方案3】:

torchvision 降级到以前的版本修复错误。

pip uninstall torchvision
pip install torchvision==0.2.2.post3

【讨论】:

我不会投反对票,因为这显然对其他人有用,但对我没有用。很好奇为什么。

以上是关于Pyinstaller 可执行文件无法导入 torchvision的主要内容,如果未能解决你的问题,请参考以下文章

pyinstaller 导入 scipy 模块

pyinstaller 找不到自定义导入的模块

无法在 Linux 上使用 pyinstaller 和 cefpython 创建可执行文件(ICU 数据的文件描述符无效)

pyinstaller简要使用说明

pyinstaller

Pyinstaller onefile 可执行文件非常庞大和缓慢