I have a bunch of legacy code for encoding raw emails that contains a lot of print statements such as
print >>f, "Content-Type: text/plain"
This is all well and good for emails, but we're now leveraging the same code for outputting HTTP request. The problem is that the Python print statement outputs '\n'
whilst HTTP requires '\r\n'
.
It looks like Python (2.6.4 at least) generates a trailing PRINT_NEWLINE
byte code for a print statement which is implemented as
ceval.c:1582: err = PyFile_WriteString("\n", w);
Thus it appears there's no easy way to override the default newline behaviour of print. I have considered the following solutions
.replace('\n', '\r\n')
. This will interfere with HTTP messages that use multipart encoding..write
methoddef write(self, data):
if data == '\n':
data = '\r\n'
return self._file.write(data)
print >>f, text
to f.write(text + line_end)
where line_end
can be '\n'
or '\r\n'
.I believe the third option would be the most appropriate. It would be interesting to hear what your Pythonic approach to the problem would be.
You should solve your problem now and for forever by defining a new output function. Were print a function, this would have been much easier.
I suggest writing a new output function, mimicing as much of the modern print function signature as possible (because reusing a good interface is good), for example:
def output(*items, end="\n", file=sys.stdout):
pass
Once you have replaced all prints in question, you no longer have this problem -- you can always change the behavior of your function instead! This is a big reason why print was made a function in Python 3 -- because in Python 2.x, "all" projects invariably go through the stage where all the print
statements are no longer flexible, and there is no easy way out.
(Not sure how/if this fits with the wrapper you intend to use, but in case...)
In Python 2.6 (and many preceding versions), you can suppress the newline by adding a comma at the end of the print statement, as in:
data = 'some msg\r\n'
print data, # note the comma
The downside of using this approach however is that the print syntax and behavior is changed in Python3.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With