2016-08-29 2 views
1

У меня есть приложение, написанное в комбинации Python и Cython. Недавно я добавил новую функцию и тесты для этого приложения. Тесты проходят на моей локальной машине (macbook), но когда я нажимаю на appveyor (служба Windows CI), тесты терпят неудачу. Это само по себе не так странно. Когда я добавляю инструкции печати к своему Cython-коду, пытаясь увидеть, что происходит, когда оно работает на апплеере, тесты больше не терпят неудачу. Это разочаровывает, потому что это не дает мне понять, что происходит, когда тесты терпят неудачу на апвейере. Это также просто озадачивает, потому что это нарушает мое понимание того, как работают Python и Cython в целом.Добавление операторов печати в код cython влияет на вывод

Мой код сложный, и для меня нет разумного способа поделиться примером этого явления. Тем не менее, я ищу причины, которые могут произойти. Как и в каких ситуациях утверждение печати в коде Cython влияет на другие вычисления?

ответ

2

Типичный случай в моем опыте - это то, где вам удалось захватить значение из нераспределенного или нераспределенного хранилища - короче говоря, ошибку использования памяти, которая утончает способность компилятора обнаруживать такое злоупотребление. Обычно вы получаете стоимость мусора; оператор печати заставляет оценивать или выравнивать память, которая «исправляет» проблему.

Это трудно сделать случайно на большинстве современных языков, если только вы специально не «скопировали» значение, изменив тип, не изменяя значение бита.

+0

Проблема оказалась неинициализированным целым числом, которое необходимо было инициализировать до нуля. В macbook это все равно начиналось с нуля, но я полагаю, что в Windows это было просто случайное значение в памяти. Я еще не понимаю, почему печать конкретной комбинации других переменных, по-видимому, устраняет проблему. Тем не менее, я подозреваю, что это нечто близкое к тому, что вы описываете. – jcrudy

+0

Aha! Я разочарован тем, что ваш код разрешил неинициализированную переменную; Я довольно привык к первой ссылке, получающей ошибку во время выполнения. Да, я ожидаю, что добавленный ** print ** просто ударил кулак из 0 бит в нужное место для вас. – Prune

+0

В обычном Python вы получаете ошибку во время выполнения при попытке использовать значение неинициализированной переменной. В Cython вы можете объявить переменную типа C, не инициализируя ее. Поэтому я объявил int counter, но забыл установить его начальное значение на ноль. – jcrudy

1

Чтобы сэкономить время, вы можете попытаться отлаживать глубже, используя блокировку RDP (https://www.appveyor.com/docs/how-to/rdp-to-build-worker/), которую вы можете вставить на разных этапах сборки Appveyor. Просто обратите внимание, что переменные среды в сеансе RDP не такие же, как для процесса агента сборки, поэтому вам может потребоваться настроить среду RDP для получения репо.

--ilya.

Смежные вопросы