#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
? Я понимаю, что это должен быть код страны, но не нашел ни одного с буквой «С».