问题:我的Django应用程序在每个CRLF之前引入一个CR,当向文件写入一个已经通过render_to_string读入的字符串时。在我的模板文件中,我使用了CRLF,Django处理应用程序编写了一个文件,在每个CRLF之前添加一个CR。请参阅下面的代码详细信息。
然而:这只发生在我的客户的应用程序上。 Windows Server 12R2 VM位于法国。我的物理Windows 10笔记本电脑,我的ubuntu实例和我的AWS Windows Server 12实例(我在客户端机器上安装之前用于测试)不会添加CR。
警告:出于安全考虑,我只能通过远程桌面访问客户端的VM,因此我需要与IT小组预约,以便探索和调试问题。而且,这是一个9小时的时差,并花费他宝贵的时间。因此,我需要在我的AWS实例上重新创建此问题,以便我可以尝试调试我的代码。并且,当我说它引入CR而不是CRLF时,我可能会记住它错了 - 可能是我的代码引入了LF而不是CRLF。我一直在使用Notepad ++和"显示所有字符"为了在生成的文件中看到CR(或LF)和CRLF。我认为Notepad ++说我的错误文件是" Macintosh"而我的起始模板文件是" Dos \ Windows。"
那是什么:嗯,生成的文件是R脚本。并且,Windows R在读取第一行后通过给出错误而不喜欢CR作为换行符。如果我使用生成的R脚本并在Notepad ++中打开它,然后将换行符(通过状态栏的右下角)更改为Dos \ Windows,那么我的Rscript将正常工作。
更多细节:以下是一些代码,以便您可以准确了解我如何阅读/呈现模板以及如何将其保存到文件中。我的模板和模板字典中没有非ASCII字符,所以我不怀疑它是unicode问题(我使用的是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 VM一样,那么这将是非常有用的。我尝试将我的AWS实例的语言更改为法语,但是没有这样做,即我的应用程序仅使用CRLF生成文件。我不确定从哪里开始。提前谢谢!
答案 0 :(得分: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
我还能够通过用'\ n'替换所有'\ r'来解决问题:
rstring = rstring.replace("\r", "\n")