AppDailySales: работает, но скачанный файл gzip поврежден - PullRequest
0 голосов
/ 18 января 2011

Я пытаюсь использовать модуль appdailysales.py для ежедневной загрузки наших приложений для iPhone. Я являюсь разработчиком .NET, поэтому я попытался запустить его с помощью IronPython в решении C #, используя следующий код:

using IronPython.Hosting;

var ipy = Python.CreateRuntime();
dynamic appSales = ipy.UseFile("appdailysales.py");            
appSales.main();

Поскольку у меня не было gzip, я вынул ссылки на этот модуль. Я собирался использовать класс GZipStream C # для распаковки файла (Apple предоставляет их загрузки в виде файлов .gz). Итак, я закомментировал строки 75 и 429-435.

Я попытался выполнить appdailysales.py в своем решении C #, прямо из IronPython и с помощью Python 2.7 (установлен ActivePython вчера вечером); все с одинаковыми результатами: Когда я пытаюсь открыть файл .gz с помощью 7zip, я получаю следующую ошибку:

CRC Failed ... файл поврежден

Когда я пытаюсь использовать класс GZipStream, я получаю:

CRC в нижнем колонтитуле GZip не совпадает с CRC, рассчитанным по распакованным данным

Если я загружаю файл .gz вручную, я могу легко распаковать файл, используя 7Zip или GZipStream.

Я свободно говорю на C #, но плохо знаком с Python. Мы будем благодарны за любую помощь, которую вы можете оказать.

Спасибо за ваше время.

1 Ответ

1 голос
/ 20 января 2011

Похоже, что проблема в строке 444.Вот строки 444-446:

downloadFile = open(filename, 'w')
downloadFile.write(filebuffer)
downloadFile.close()

На этом этапе, если вы удалили строки 429-435 ИЛИ выбраны, чтобы не разархивировать, то filebuffer относится к необработанному сжатому потоку, полученному из Интернета.,Выходной файл открывается в режиме TEXT, и вы работаете в Windows, поэтому каждый \n в потоке сжатого двоичного файла будет преобразован в \r\n - КОРРУПЦИЯ, как сказано в сообщении об ошибке.

Итак:для того, чтобы модуль мог использоваться как на Windows, так и на других платформах, режим открытия должен быть «wb» (b для двоичного).Если файл результатов с заархивированными файлами также является двоичным файлом, в открытом вызове можно жестко закодировать «wb».Однако, если заархивированный файл представляет собой текстовый файл (предназначенный для возможности открытия в текстовом редакторе), для этой цели вам нужно просто указать «w», а для переменной mode следует установить значение «wb» или «wb».w "при необходимости, и используйте mode в открытом вызове.

Большой вопрос: я понимаю, почему вы удалили ссылки gzip для использования IronPython.Вы удалили эти строки для Python 2.7?Или вы запустили его под Python 2.7 с этими строками, но установили для options.unzipFile значение False?

...