Python PyInstaller可执行文件无法获取TorcScript的源代码

Python PyInstaller可执行文件无法获取TorcScript的源代码,python,pytorch,pyinstaller,Python,Pytorch,Pyinstaller,我正在尝试使包含PyTorch的脚本的Windows可执行文件。我的脚本的导入为: import numpy.core.multiarray # which is a workaround for "ImportError: numpy.core.multiarray failed to import" import six # which is workaround for "ModuleNotFoundError: No module named 'six'" import torch i

我正在尝试使包含PyTorch的脚本的Windows可执行文件。我的脚本的导入为:

import numpy.core.multiarray  # which is a workaround for "ImportError: numpy.core.multiarray failed to import"
import six # which is workaround for "ModuleNotFoundError: No module named 'six'"
import torch
import torch.nn as nn
import warnings
import argparse
import json
import math
import numpy as np
import jsonschema
import os
from datetime import datetime
from sklearn.mixture import GaussianMixture
from scipy.io import wavfile
from scipy.signal import get_window
from scipy.signal import spectrogram
我正在使用命令:

pyinstaller --hidden-import pkg_resources.py2_warn extractor.py
PyInstaller在创建.exe时不会抛出错误,但当我运行.exe时,会得到:

Traceback (most recent call last):
  File "site-packages\torch\_utils_internal.py", line 46, in get_source_lines_and_file
  File "inspect.py", line 967, in getsourcelines
  File "inspect.py", line 798, in findsource
OSError: could not get source code

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "extractor.py", line 3, in <module>
    import torch
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "C:\ProgramData\Anaconda3\envs\forexe2\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\torch\__init__.py", line 367, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "C:\ProgramData\Anaconda3\envs\forexe2\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\torch\distributions\__init__.py", line 112, in <module>
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "C:\ProgramData\Anaconda3\envs\forexe2\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\torch\distributions\von_mises.py", line 55, in <module>
  File "site-packages\torch\jit\__init__.py", line 1287, in script
  File "site-packages\torch\jit\frontend.py", line 164, in get_jit_def
  File "site-packages\torch\_utils_internal.py", line 53, in get_source_lines_and_file
OSError: Can't get source for <function _rejection_sample at 0x0000000006892F70>. TorchScript requires source access in order to carry out compilation, make sure original .py files are available. Original error: could not get source code
[5704] Failed to execute script extractor
回溯(最近一次呼叫最后一次):
文件“site packages\torch\\u utils\u internal.py”,第46行,在get\u source\u line和\u文件中
getsourcelines中第967行的文件“inspect.py”
findsource中第798行的文件“inspect.py”
OSError:无法获取源代码
在处理上述异常期间,发生了另一个异常:
回溯(最近一次呼叫最后一次):
文件“extractor.py”,第3行,在
进口火炬
文件“”,第991行,在“查找”和“加载”中
文件“”,第975行,在“查找”和“加载”中解锁
文件“”,第671行,在\u加载\u解锁
exec_模块中的文件“C:\ProgramData\Anaconda3\envs\forexe2\lib\site packages\PyInstaller\loader\pyimod03_importers.py”,第623行
exec(字节码、模块、指令)
文件“site packages\torch\\uuuuu init\uuuuuuu.py”,第367行,在
文件“”,第991行,在“查找”和“加载”中
文件“”,第975行,在“查找”和“加载”中解锁
文件“”,第671行,在\u加载\u解锁
exec_模块中的文件“C:\ProgramData\Anaconda3\envs\forexe2\lib\site packages\PyInstaller\loader\pyimod03_importers.py”,第623行
exec(字节码、模块、指令)
文件“site packages\torch\distributions\\uuuu init\uuuu.py”,第112行,在
文件“”,第991行,在“查找”和“加载”中
文件“”,第975行,在“查找”和“加载”中解锁
文件“”,第671行,在\u加载\u解锁
exec_模块中的文件“C:\ProgramData\Anaconda3\envs\forexe2\lib\site packages\PyInstaller\loader\pyimod03_importers.py”,第623行
exec(字节码、模块、指令)
文件“site packages\torch\distributions\von_mises.py”,第55行,在
脚本中的文件“site packages\torch\jit\\ uuu init\ uu.py”,第1287行
文件“site packages\torch\jit\frontend.py”,第164行,在get_jit_def中
文件“site packages\torch\\u utils\u internal.py”,第53行,在get\u source\u line\u和\u文件中
OSError:无法获取的源代码。TorchScript需要源代码访问才能执行编译,请确保原始.py文件可用。原始错误:无法获取源代码
[5704]无法执行脚本提取器
我不明白。这可能是类似的问题。是什么导致了问题

我使用的是conda env,火炬通过pip安装(这是火炬正确连接的一个解决方法)

  • 视窗10
  • Python 3.8.2
  • 火炬1.5.0+cu101
  • torchvision 0.6.0+cu101(也尝试使用0.2.2)
  • PyInstaller 3.6

Torch是开源的,因此您可以在Torch GitHub上搜索函数
\u retainment\u sample
。这将问题文件标识为。如果您的程序未使用
torch.distributions
模块,只需更改pyinstaller生成的
.spec
文件即可将其排除

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None
excluded_modules = ['torch.distributions'] # <<< ADD THIS LINE

a = Analysis(['C:/your/path/here'],
             pathex=['C:\\your\\path\\here'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=excluded_modules,    # <<< CHANGE THIS LINE
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
# remaining code omitted for brevity

将来,在构建项目时考虑使用。这还可以识别导致问题的文件的位置。

请尝试使用简单命令
pyinstaller-f extractor.py
或在CMD上手动检查这些模块。是否解决了此问题?下面的解决方案对我不起作用…遗憾的是没有-我刚刚发现我的旧conda环境起作用,所以似乎是一些软件包版本问题。。。
pyinstaller your_file.spec