使用 PyInstaller 创建捆绑包时如何设置 LANG
How to set LANG when creating a bundle with PyInstaller
我正在使用 PyQt5 (5.10) 和 Python 3.6 创建一个应用程序。
我正在使用 PyInstaller 来捆绑我的应用程序。在 MacOS 上,
PyInstaller 创建一个名为 dist
的目录,其中包含一个可执行文件 myapp
和包 myapp.app
。
可执行文件 运行 完美无缺。
包 myapp.app
运行 很好,但是当我将重音字符插入 é
到输入小部件时,应用程序崩溃并出现错误:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 63: ordinal not in range(128)
myapp.app
仅包含可执行文件 myapp
,如我所料 运行。
我已经在空环境下 运行 myapp
进行了测试:
env -i ./myapp
我收到与 myapp.app
相同的错误。
定义了 LANG
:
env -i LANG=fr_FR.UTF-8 ./myapp
没有错误。
所以,我现在知道问题与 LANG environment variable
有关。
现在,我的问题是:
如何创建我的包以允许 myapp.app
访问 LANG 环境变量?
任何帮助将不胜感激。
这是我的 PyInstaller 规范文件:
# -*- mode: python -*-
import os
import sys
block_cipher = None
if os.name == 'nt':
icon = 'images/icon.ico'
elif sys.platform == 'darwin':
icon = 'images/icon.icns'
else:
icon = None
a = Analysis(['../main.py'],
pathex=['.'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='My App',
debug=False,
strip=False,
upx=False,
runtime_tmpdir=None,
console=False, icon=icon)
app = BUNDLE(exe,
name='My App.app',
icon=icon,
bundle_identifier='com.me.myapp',
info_plist={
'NSHighResolutionCapable': 'True'
},)
终于找到了解决我的问题的方法。
我不知道它崩溃的确切原因,但是我没有打印 str(my_value)
,而是将它发送到带有日志记录模块的日志文件中,并且不再有任何崩溃。
sys.getdefaultencoding()
returns utf-8
所以还是个谜...所以我猜应该是编码和stdio的问题。
我遇到了同样的问题,而不是输出到日志文件。我按照以下命令重新配置 stdout 的 utf-8:
sys.stdout.reconfigure(编码='utf-8')
也许它可以解决您的问题。
我正在使用 PyQt5 (5.10) 和 Python 3.6 创建一个应用程序。
我正在使用 PyInstaller 来捆绑我的应用程序。在 MacOS 上,
PyInstaller 创建一个名为 dist
的目录,其中包含一个可执行文件 myapp
和包 myapp.app
。
可执行文件 运行 完美无缺。
包 myapp.app
运行 很好,但是当我将重音字符插入 é
到输入小部件时,应用程序崩溃并出现错误:
UnicodeEncodeError: 'ascii' codec can't encode character '\xe9' in position 63: ordinal not in range(128)
myapp.app
仅包含可执行文件 myapp
,如我所料 运行。
我已经在空环境下 运行 myapp
进行了测试:
env -i ./myapp
我收到与 myapp.app
相同的错误。
定义了 LANG
:
env -i LANG=fr_FR.UTF-8 ./myapp
没有错误。
所以,我现在知道问题与 LANG environment variable
有关。
现在,我的问题是:
如何创建我的包以允许 myapp.app
访问 LANG 环境变量?
任何帮助将不胜感激。
这是我的 PyInstaller 规范文件:
# -*- mode: python -*-
import os
import sys
block_cipher = None
if os.name == 'nt':
icon = 'images/icon.ico'
elif sys.platform == 'darwin':
icon = 'images/icon.icns'
else:
icon = None
a = Analysis(['../main.py'],
pathex=['.'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
name='My App',
debug=False,
strip=False,
upx=False,
runtime_tmpdir=None,
console=False, icon=icon)
app = BUNDLE(exe,
name='My App.app',
icon=icon,
bundle_identifier='com.me.myapp',
info_plist={
'NSHighResolutionCapable': 'True'
},)
终于找到了解决我的问题的方法。
我不知道它崩溃的确切原因,但是我没有打印 str(my_value)
,而是将它发送到带有日志记录模块的日志文件中,并且不再有任何崩溃。
sys.getdefaultencoding()
returns utf-8
所以还是个谜...所以我猜应该是编码和stdio的问题。
我遇到了同样的问题,而不是输出到日志文件。我按照以下命令重新配置 stdout 的 utf-8:
sys.stdout.reconfigure(编码='utf-8')
也许它可以解决您的问题。