使用 Windows 构建可执行文件时出现 keystoneauth1 错误(pyinstaller、cx_Freeze、py2exe)

问题描述 投票:0回答:1

如标题所示,我在将应用程序转换为 .exe 文件时遇到问题。问题似乎出在 keystoneauth1 库上。

我创建了一个最小测试“hello.py”来进行故障排除,并将问题隔离在导入 keystoneauth1.identity.v3 时。我可以在控制台中正常运行下面的脚本并获得预期的输出,但构建的 .exe 文件失败。

from keystoneauth1.identity import v3
print("Hello World!")

运行创建的.exe-文件时出现以下错误:

pyinstaller

File "hello.py", line 1, in \<module\>
File "\<frozen importlib.\_bootstrap\>", line 1027, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 1006, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 688, in _load_unlocked
File "PyInstaller\\loader\\pyimod02_importers.py", line 385, in exec_module
File "keystoneauth1\\identity_init_.py", line 13, in \<module\>
File "\<frozen importlib.\_bootstrap\>", line 1027, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 1006, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 688, in \_load_unlocked
File "PyInstaller\\loader\\pyimod02_importers.py", line 385, in exec_module
File "keystoneauth1\\identity\\base.py", line 21, in \<module\>
File "\<frozen importlib.\_bootstrap\>", line 1027, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 1006, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 688, in _load_unlocked
File "PyInstaller\\loader\\pyimod02_importers.py", line 385, in exec_module
File "keystoneauth1\\access_init_.py", line 13, in \<module\>
File "\<frozen importlib.\_bootstrap\>", line 1027, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 1006, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 688, in \_load_unlocked
File "PyInstaller\\loader\\pyimod02_importers.py", line 385, in exec_module
File "keystoneauth1\\access\\access.py", line 20, in \<module\>
File "\<frozen importlib.\_bootstrap\>", line 1027, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 1006, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 688, in \_load_unlocked
File "PyInstaller\\loader\\pyimod02_importers.py", line 385, in exec_module
File "keystoneauth1\\access\\service_catalog.py", line 22, in \<module\>
File "\<frozen importlib.\_bootstrap\>", line 1027, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 1006, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 688, in \_load_unlocked
File "PyInstaller\\loader\\pyimod02_importers.py", line 385, in exec_module
File "keystoneauth1\\discover.py", line 28, in \<module\>
File "\<frozen importlib.\_bootstrap\>", line 1027, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 1006, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 688, in _load_unlocked
File "PyInstaller\\loader\\pyimod02_importers.py", line 385, in exec_module
File "os_service_types_init_.py", line 18, in \<module\>
File "\<frozen importlib.\_bootstrap\>", line 1027, in \_find_and_load
File "\<frozen importlib.\_bootstrap\>", line 1006, in \_find_and_load_unlocked
File "\<frozen importlib.\_bootstrap\>", line 688, in _load_unlocked
File "PyInstaller\\loader\\pyimod02_importers.py", line 385, in exec_module
File "os_service_types\\service_types.py", line 23, in \<module\>
File "os_service_types\\data_init_.py", line 30, in read_data
FileNotFoundError: \[Errno 2\] No such file or directory: '\\Local\\Temp\\\_MEI2202\\os_service_types\\data\\service-types.json'
\[13472\] Failed to execute script 'hello' due to unhandled exception!

cx_冻结

.venv\\Lib\\site-packages\\cx_Freeze\\initscripts\__startup_\_.py", line 124, in run
.venv\\Lib\\site-packages\\cx_Freeze\\initscripts\\console.py", line 16, in run
exec(code, module_main.__dict__)
File "hello.py", line 1, in \<module\>
File ".venv\\lib\\site-packages\\keystoneauth1\\identity\__init_\_.py", line 13, in \<module\>
from keystoneauth1.identity import base
File ".venv\\lib\\site-packages\\keystoneauth1\\identity\\base.py", line 21, in \<module\>
from keystoneauth1 import access
File ".venv\\lib\\site-packages\\keystoneauth1\\access\__init_\_.py", line 13, in \<module\>
from keystoneauth1.access.access import \*  # noqa
File ".venv\\lib\\site-packages\\keystoneauth1\\access\\access.py", line 20, in \<module\>
from keystoneauth1.access import service_catalog
ImportError: cannot import name 'service_catalog' from partially initialized module 'keystoneauth1.access' (most likely due to a circular import) (build\\exe.win-amd64-3.10\\lib\\keystoneauth1\\access\__init_\_.pyc)

py2exe

File "hello.py", line 1, in \<module\>
File "keystoneauth1\\identity\__init_\_.pyc", line 13, in \<module\>
File "keystoneauth1\\identity\\base.pyc", line 21, in \<module\>
File "keystoneauth1\\access\__init_\_.pyc", line 13, in \<module\>
File "keystoneauth1\\access\\access.pyc", line 20, in \<module\>
File "keystoneauth1\\access\\service_catalog.pyc", line 22, in \<module\>
File "keystoneauth1\\discover.pyc", line 28, in \<module\>
File "os_service_types\__init_\_.pyc", line 18, in \<module\>
File "os_service_types\\service_types.pyc", line 23, in \<module\>
File "os_service_types\\data\__init_\_.pyc", line 30, in read_data
FileNotFoundError: \[Errno 2\] No such file or directory: '\\dist\\library.zip\\os_service_types\\data\\service-types.json'

我已经使用 python 版本 3.9.13 和 3.10.11 进行了测试。我正在使用虚拟环境。

python pyinstaller cx-freeze py2exe
1个回答
0
投票

不确定这是否是正确的方法,但是,我面临着完全相同的问题,而这个 pyinstaller 的规范文件为我解决了问题

# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.utils.hooks import collect_submodules
from PyInstaller.utils.hooks import copy_metadata
import sys
from os import path
site_packages = next(p for p in sys.path if 'site-packages' in p)

hiddenimports = ['keystoneauth1', 'os_service_types', 'jsonschema_specifications']
hiddenimports += collect_submodules('os_service_types')
hiddenimports += collect_submodules('jsonschema_specifications')

added_files = [
    (path.join(site_packages,'os_service_types'), 'os_service_types'),
    (path.join(site_packages,'jsonschema_specifications'), 'jsonschema_specifications')
]
added_files += copy_metadata('os_service_types')
added_files += copy_metadata('keystoneauth1')
added_files += copy_metadata('python-keystoneclient')
added_files += copy_metadata('python-openstackclient')
added_files += copy_metadata('python-neutronclient')
added_files += copy_metadata('python-glanceclient')
added_files += copy_metadata('python-novaclient')
added_files += copy_metadata('python-cinderclient')
© www.soinside.com 2019 - 2024. All rights reserved.