使用 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')

也许它可以解决您的问题。