Разное поведение my_app.app (завершается) и my_app.app/Содержимое/macOS/my_app (работает отлично)

#python #macos #macos-big-sur #.app

Вопрос:

У меня есть функция test() , как показано ниже, загрузки txt-файла, содержащего эмодзи и другие специальные символы юникода. Загруженное содержимое сохраняется в файл .txt, а затем в каждой строке с добавленными номерами строк в файл .csv.

Когда я строю испытания.приложение (используя py2app) и запустите его, его не спасти .файл txt (показывает тот же контент, как и оригинал), но при сохранении .CSV, он останавливается на первой специальный символ (с сообщением об ошибке ошибка теста: Откройте консоль / завершить; системы.сервис показывает журнала вышел с ненормальным код: 255′).

С другой стороны, при запуске test.app/Contents/macOS/test он работает правильно и сохраняет весь контент в формате .csv без каких-либо проблем.

Я протестировал его с чистой версией Python, а также с цитонизацией, а также с подписью кода. Во всех случаях .app не работает, в то время как .app/Содержимое/macOS/тест работает должным образом.

Я хотел бы знать, почему это по-другому (я начал работать с Mac всего 3 месяца назад и определенно не знаю об этом всего) и что я должен изменить, чтобы мое приложение 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-данные.журнал:

 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: #
 

тест.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,#
 

Комментарии:

1. как вы превращаете свой код python в .app, pyinstaller, py2app или другое

2. @KetZoomer Как упоминалось в моем вопросе, я использую py2app.

3. извините, не видел этого, попробуйте использовать pyinstaller, может быть ошибка с py2app

4. У нас было много проблем с PyInstaller (связанных с отсутствующими библиотеками / невозможностью найти dylibs в Big Sur), поэтому мы в конечном итоге использовали py2app. Я просто не понимаю, как возможно, что у .app есть проблемы только с этим одним действием (у него есть еще много функций, включая графический интерфейс и работу с онлайн-данными, чтение/запись файлов в различных форматах и т. Д., И все остальное работает хорошо, только эта конкретная функция в определенных случаях не работает), в то время как двоичный файл внутри .app хорошо работает во всех случаях (если это связано с ошибкой в упаковке, он тоже не должен работать, не так ли?)

5. Я назначил награду (предложите свою репутацию) за это, надеюсь, это привлечет некоторое внимание, так как это интересный вопрос, который я хотел бы увидеть и ответить на него

Ответ №1:

приложение запускается с другим языком, отличным от того, который используется при запуске непосредственно в командной строке.

Попробуйте вставить свой .py :

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

Для объяснения языка C см. https://docs.oracle.com/cd/E23824_01/html/E26033/glmbx.html

Комментарии:

1. Спасибо вам за ваш ответ. Есть ли какая-либо разница между двойным щелчком (в Finder) my_app.app и двойным щелчком двоичного файла внутри него ( my_app.app/Contents/MacOS/my_app )? Я попробую, как только сяду за свой рабочий компьютер.

2. Он ведет себя точно так же.

3. Тогда, к сожалению, это не может быть решением моей проблемы. Потому что двоичный файл внутри нашего .app хорошо работает при двойном щелчке, а вот .app-нет.

4. Я имею в виду, что с моим изменением это должно сработать в обеих ситуациях.

5. Я попробую. Не могли бы вы, пожалуйста, сообщить мне, что означает «С» в locale.setlocale ? Я понимаю, что это должен быть код страны, но не нашел ни одного с буквой «С».