2017-01-07 10 views
2

Задача: Приложение Django представляет CR перед каждым CRLF при записи в файл строки, которая была прочитана через render_to_string. В файлах шаблонов я использовал CRLF, и приложение обработки Django записывает файл, который добавляет CR перед каждым CRLF. Подробнее см. Ниже.Проблемы с Newlines с использованием django на Windows Server во Франции

Однако: это происходит только с моим приложением, которое находится на моем компьютере клиентов Windows Server 12R2, который находится во Франции. Мой физический компьютер с Windows 10, мои экземпляры ubuntu и мой экземпляр AWS Windows Server 12 (который я использую для тестирования перед установкой на машине моего клиента) не добавляют CR.

Caveat: Из соображений безопасности я могу получить доступ только к виртуальной машине моего клиента через удаленный рабочий стол, поэтому мне нужно назначить встречу с группой ИТ, чтобы изучить и отладить проблему. И это 9-часовая разница во времени и занимает его драгоценное время. Таким образом, мне нужно воссоздать эту проблему на моем экземпляре AWS, чтобы попытаться отладить мой код. И, когда я говорю, что он вводит CR вместо CRLF, тогда я, возможно, помню это неправильно - возможно, мой код вводит LF вместо CRLF. Я использовал Notepad ++ и «показываю все символы», чтобы увидеть CR (или LF) и CRLF в сгенерированных файлах. Я думаю, что Notepad ++ сказал, что мой ошибочный файл - «Macintosh», в то время как мой начальный файл шаблона - «Dos \ Windows».

Итак, что: Ну, сгенерированный файл является скриптом R. И окна R не любят CR как символы новой строки, вызывая ошибку после прочтения первой строки. Если я возьму сгенерированный R-скрипт и откройте его в Notepad ++, а затем измените новые строки (через нижнюю правую сторону строки состояния) на Dos \ Windows, тогда мой Rscript будет работать нормально.

Еще несколько деталей: Вот некоторые из кода, чтобы вы могли точно видеть, как я читаю/отрисовка шаблона и как я сохраняю его в файле. Там нет не-ASCII символов в шаблоне, ни в шаблоне Словаре, так что я не подозреваю, что это проблема юникода (Я использую Python 2):

rstring = render_to_string('helpers.R') + "\n" + render_to_string('Rcalc-template.R', {'debug':1}) 
rscript_file = os.path.join(tmpdir, 'Rcalc-rendered.R') 
fh = open(rscript_file, mode="w") 
with fh: 
    fh.write(rstring) 
subprocess.call(['Rscript', rscript_file], 
       universal_newlines=True, 
       stdout=log_filename, 
       stderr=subprocess.STDOUT, 
       shell=False) 

Что мне нужно от вас: если у кого-то есть представление о том, как я могу заставить свой экземпляр AWS Windows 2012R2 вести себя как виртуальная машина Windows 2012R2 во Франции, тогда это было бы очень полезно. Я попытался изменить язык моего экземпляра AWS на французский язык, но этого не делал, т. Е. Только файлы, созданные с помощью CRLF. Я не совсем уверен, куда идти отсюда. Заранее спасибо!

+0

Может быть, мне нужно записать файл обратно в двоичном режиме вместо так что python не настраивает новые строки? http://stackoverflow.com/questions/41369772/how-to-change-end-of-line-conventions – brfox

+0

или другая ссылка: http://stackoverflow.com/questions/2536545/how-to-write-unix- end-of-line-characters-in-windows-using-python – brfox

+0

В Windows запись '\ n' в файл переводится в' \ r \ n', если вы не укажете двоичный режим при открытии файла. Используйте '' wb'', если вы пишете '\ r \ n' явно, или вместо этого вы получите' \ r \ r \ n'. –

ответ

0

версии Django У меня был шанс удалиться на сервер, где мой код был развернут на несколько минут, и была разница версий Django! Мой развернутый сервер имел django 1.7.1, а моя тестовая версия - 1.8.17. Итак, я пошел на свой тестовый сервер AWS и переместил версию Django на 1.7.1 и, конечно же, ошибка была воспроизводимой! Таким образом, это не было для Windows или локализации или языковой вопрос ...

В примечаниях к выпуску, он упомянул поддержку в Файл для универсальных: переводы строк https://docs.djangoproject.com/en/1.10/releases/1.8

Я думаю, что это билет и фиксация, которая фиксировала его?

https://code.djangoproject.com/ticket/8149 https://github.com/django/django/commit/eb4f6de980c5148ba48d4ed67f31cca27dd132a8

Я также был в состоянии решить эту проблему, заменив все «\ г» с «\ п»:

rstring = rstring.replace("\r", "\n")