Pyinstaller可执行文件导入torchvision失败

6

这是我的main.py文件:

import torchvision
input("Press key")

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

我需要一个Windows可执行文件,所以我做了这个:pyinstaller main.py

但是当我启动/dist/main目录下的main.exe时,出现了以下错误:

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

系统信息:

  • Windows 10
  • Python 3.7
  • torch-1.1.0
  • torchvision-0.3.0

[EDIT]

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

main.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 吗? - Masoud Rahimi
是的,我尝试过了,但并没有解决问题。 不过仅导入torch可以正常工作。Torchvision会出现错误。 - FabioDev
3个回答

3

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

pip uninstall torchvision
pip install torchvision==0.2.2.post3

我不会点踩,因为这显然对其他人有效,但对我无效。好奇为什么。 - bpops

1
猴子补丁对我无效,因为当我导入torch.jit时出现了错误。因此,在导入torch之前,我在我的main.py中使用了以下解决方法:
os.environ["PYTORCH_JIT"] = "0"

显然,您会失去JIT优化,但至少可执行文件能够正常工作。

我花了数小时尝试了所有能找到的解决方案,包括上面所有的答案/评论。这是唯一对我有效的方法。我意识到它并不是完美的解决方案,正如你自己所指出的那样,但它是一个解决方案。谢谢! - bpops
很高兴能够帮助到您 :) - Shiriru

1
尝试使用这个猴子补丁。
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接