Python my_app.app(终止)和my_app.app/Contents/MacOS/my_app(工作正常)的不同行为

Python my_app.app(终止)和my_app.app/Contents/MacOS/my_app(工作正常)的不同行为,python,macos,macos-big-sur,.app,Python,Macos,Macos Big Sur,.app,我有一个函数test(),如下所示,下载一个包含表情符号和其他unicode特殊字符的文件。下载的内容保存到.txt文件中,然后每行添加行号,保存到.csv文件中 当我构建test.app(使用py2app)并运行它时,它会保存.txt文件(显示与原始文件相同的内容),但在保存.csv时,它会在第一个特殊字符处停止(错误消息test error:Open console/Terminate;system.log显示“服务退出,异常代码为255”) 另一方面,当运行test.app/Content

我有一个函数
test()
,如下所示,下载一个包含表情符号和其他unicode特殊字符的文件。下载的内容保存到.txt文件中,然后每行添加行号,保存到.csv文件中

当我构建test.app(使用py2app)并运行它时,它会保存.txt文件(显示与原始文件相同的内容),但在保存.csv时,它会在第一个特殊字符处停止(错误消息test error:Open console/Terminate;system.log显示“服务退出,异常代码为255”)

另一方面,当运行test.app/Contents/MacOS/test时,它工作正常,并将整个内容保存到.csv中,没有任何问题

我已经用纯Python版本以及cythonized和代码签名对它进行了测试。在所有情况下,.app都不能正常工作,而.app/Contents/MacOS/test工作正常

def test():
    url = 'https://unicode.org/Public/emoji/1.0/emoji-data.txt'
    log_filename = 'emoji-data.log'
    globals.log_file = open(log_filename, 'w', buffering=1)

    output_txt = 'test.txt'
    output_csv = 'test.csv'
    keys = ('row_nr', 'row')
    with open(output_csv, 'w') as outfile:
        writer = csv.writer(outfile, delimiter=',')
        writer.writerow(keys)

    logging.info(f'going to download...')
    with requests.get(url, timeout=5) as resp:
        with open(str(output_txt), 'wb') as f:
            for chunk in resp.iter_content(chunk_size=8192):
                f.write(chunk)

    encoding = resp.encoding
    if encoding is None:
        logging.info('Unknown encoding!')
        encoding = 'utf-8'
    logging.info(f'encoding = {encoding}')
    resp = resp.content.decode(encoding)
    logging.info('decoded resp')

    for i, row in enumerate(resp.split('\n')):
        logging.info(f'row {i}: {row}')

        with open(output_csv, 'a') as outfile:
            writer = csv.writer(outfile, delimiter=',')
            writer.writerow((i, row))
            
    logging.info('... done')

    # closing:
    if log_file:
        log_file.close()
    return

test()
我想知道为什么它不同(我3个月前才开始使用Mac,肯定不知道它的一切),我应该做些什么来让我的test.app正常工作

def test():
    url = 'https://unicode.org/Public/emoji/1.0/emoji-data.txt'
    log_filename = 'emoji-data.log'
    globals.log_file = open(log_filename, 'w', buffering=1)

    output_txt = 'test.txt'
    output_csv = 'test.csv'
    keys = ('row_nr', 'row')
    with open(output_csv, 'w') as outfile:
        writer = csv.writer(outfile, delimiter=',')
        writer.writerow(keys)

    logging.info(f'going to download...')
    with requests.get(url, timeout=5) as resp:
        with open(str(output_txt), 'wb') as f:
            for chunk in resp.iter_content(chunk_size=8192):
                f.write(chunk)

    encoding = resp.encoding
    if encoding is None:
        logging.info('Unknown encoding!')
        encoding = 'utf-8'
    logging.info(f'encoding = {encoding}')
    resp = resp.content.decode(encoding)
    logging.info('decoded resp')

    for i, row in enumerate(resp.split('\n')):
        logging.info(f'row {i}: {row}')

        with open(output_csv, 'a') as outfile:
            writer = csv.writer(outfile, delimiter=',')
            writer.writerow((i, row))
            
    logging.info('... done')

    # closing:
    if log_file:
        log_file.close()
    return

test()
emoji-data.log:

going to download...
encoding = utf-8
decoded resp
row 0: # Emoji Data for UTR #51
row 1: #
row 2: # File:    emoji-data.txt
row 3: # Version: 1.0
row 4: # Date:    2015-08-04
row 5: #
row 6: # Copyright (c) 2015 Unicode, Inc.
row 7: # For terms of use, see http://www.unicode.org/terms_of_use.html
row 8: # For documentation and usage, see http://www.unicode.org/reports/tr51/
row 9: #
row 10: # Format: Code ; Default_Emoji_Style ; Emoji_Level ; Emoji_Modifier_Status ; Emoji_Sources # Comment
row 11: #
test.csv:

row_nr,row
0,# Emoji Data for UTR #51
1,#
2,# File:    emoji-data.txt
3,# Version: 1.0
4,# Date:    2015-08-04
5,#
6,"# Copyright (c) 2015 Unicode, Inc."
7,"# For terms of use, see http://www.unicode.org/terms_of_use.html"
8,"# For documentation and usage, see http://www.unicode.org/reports/tr51/"
9,#
10,# Format: Code ; Default_Emoji_Style ; Emoji_Level ; Emoji_Modifier_Status ; Emoji_Sources # Comment
11,#

应用程序使用与直接在命令行上运行时不同的语言环境运行

尝试输入您的.py:

import locale
locale.setlocale(locale.LC_ALL, ('C', 'UTF-8'))

有关C语言环境的解释,请参见

如何将python代码转换为.app、pyinstaller、py2app或other@KetZoomer正如我在问题中提到的,我正在使用py2app。很抱歉,没有看到,尝试使用pyinstaller,可能是py2app的错误。pyinstaller有很多问题(与缺少库/在Big Sur下找不到dylibs有关),这就是我们最终使用py2app的原因。我只是不明白.app怎么可能只在这一个操作中出现问题(它有更多的功能,包括GUI和处理在线数据、读取/写入各种格式的文件等,其他一切都很好,只是这一个特定的功能在特定的场合下不起作用)而.app中的二进制文件在所有情况下都能很好地工作(如果是由于包装中的错误,它也不应该工作,是吗?)我已经给了我一个奖励(提供我的代表),希望它能引起一些注意,因为这是一个有趣的问题,我很想看到并回答谢谢你的回答。在Finder中双击
my_app.app
和双击其中的二进制文件(
my_app.app/Contents/MacOS/my_app
)有什么区别吗?我会在我的工作计算机上尝试它。它的行为方式相同。不幸的是,它不能解决我的问题。因为我们的.app中的二进制文件在双击时工作正常,只有.app不能。我的意思是,我的更改应该在两种情况下都能工作。我会尝试。你能告诉我“C”在中的含义吗
locale.setlocale
?我知道它应该是国家代码,但没有找到任何带有“C”的。