msg104212 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-04-26 10:43 |
If a test fails, regrtest writes the backtrace to sys.stdout. If the backtrace contains a non-ASCII characters, it's encoded using sys.stdout encoding.
In some conditions, sys.stdout is unable to encode some or all non-ASCII characters. Eg. if there is no locale set (empty environment or at least empty LANG variable value), sys.stdout.encoding="ascii".
If regrtest fails to display a test output (error backtrace), regrtest exits directly (don't execute next tests).
I propose to use backslashreplace error handler in sys.stdout, as done for sys.stderr to avoid this annoying issue.
Attached patch (for py3k) replace sys.stdout by a new file using backslashreplace, just before executing the tests.
I don't know if the issue concerns also Python2.
|
msg104223 - (view) |
Author: Antoine Pitrou (pitrou) *  |
Date: 2010-04-26 11:30 |
A better resolution IMO would be to output tracebacks on stderr instead.
|
msg104229 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-04-26 12:47 |
> A better resolution IMO would be to output tracebacks on stderr instead.
Yeah, that sounds easier and safer. Attached patch writes the tracebacks to stderr.
I don't remember how to reproduce this issue :-/ I guess that stdout/stderr encoding should be ASCII (eg. LANG="") and the traceback (eg. the error message) should contain a non-ASCII character.
|
msg104231 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-04-26 12:49 |
Write to stderr instead of stdout might change buildbot output order.
|
msg104670 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-04-30 22:45 |
regrtest_traceback_stderr.patch is not enough: support._run_suite() writes output to sys.stdout instead of sys.stderr. New version of the patch fixes that.
|
msg104773 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-05-02 09:38 |
Ok, let's try sys.stderr solution: commited in r80694 (py3k).
If it breaks buildbot outputs, I will revert it and try the second solution.
|
msg104783 - (view) |
Author: Antoine Pitrou (pitrou) *  |
Date: 2010-05-02 11:08 |
Since it may reorder output, I think it's better revert the patch and try the other solution. However, I don't think you need to replace sys.stdout at all: just output the traceback more carefully.
|
msg104794 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-05-02 17:25 |
As "expected", the patch doesn't work: it randomize the output order :-(
I checked "sparc Ubuntu 3.x": the output order is correct. "test_xxx" lines are written to stdout, "FAIL: ..." + traceback are written to stderr, and the lines are written in the right order.
But it failed on "x86 Tiger 3.x" :
http://www.python.org/dev/buildbot/3.x/builders/x86 Tiger 3.x/builds/130/steps/test/logs/stdio
http://www.python.org/dev/buildbot/3.x/builders/x86 Tiger 3.x/builds/131/steps/test/logs/stdio
When a test is reexecuted in verbose mode, the output is written in red (why not, but it was not the case before my commit), and the stdout and stderr are in a "mixed".
--
antoine> just output the traceback more carefully.
Encode the traceback by hand would be possible, but it's more complex. A possible solution would be to write the output to a StringIO, encode unicode to bytes using the right encoding and backslashreplace error handler, and write the result to stdout. But I don't like buffering the output because the buildbot may hung for different reasons (search in the bug tracker for "test_multiprocessing" or "test_subprocess"...) and the buildbot master may consider the buildbot as dead (no new output since xxx seconds, whereas it's writing to a buffer).
--
I prefer my first simple idea: use backslashreplace error handler for stdout. Let's try: r80703. This commit reverts my previous commit, apply regrtest_stdout_backslashreplace.patch + a fix for multiprocessing mode (regrtest.py -j ...).
|
msg104824 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-05-03 08:37 |
> Let's try: r80703
This one looks ok: the output order is kept and I didn't noticed anything special in the buildbot output.
Backported to 3.1 as r80711. Close the issue.
|
msg105087 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-05-05 21:31 |
Reopen: r80703 (and r80711) introduces a new bug: on Windows, there is an empty string between each line. It looks like a newline error.
replace_stdout() should set the newline argument to open(). But how can I get the newline attribute from sys.stdout? sys.stdout._writenl?
regrtest_stdout_newline.patch should fix the newline problem.
|
msg105180 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-05-07 00:59 |
I disabled my patch (replace_stdout function) on Windows until it gets fixed: r80905 (py3k) and r80906 (3.1)
|
msg116003 - (view) |
Author: Hirokazu Yamamoto (ocean-city) *  |
Date: 2010-09-10 11:08 |
Hello. How about this patch? I just mimicked create_stdio() in
Python/pythonrun.c. (Mostly) Newlines looks correct as well as
python2.x. I tested this on windows.
|
msg116004 - (view) |
Author: Hirokazu Yamamoto (ocean-city) *  |
Date: 2010-09-10 11:10 |
And here is more advanced (?) patch. More closer to Python/pythonrun.c
's implementaion.
I tried regrtest_stdout_newline.patch, but it doesn't work.
# AttributeError: '_io.TextIOWrapper' object has no attribute '_writenl'
|
msg118248 - (view) |
Author: Hirokazu Yamamoto (ocean-city) *  |
Date: 2010-10-09 07:50 |
I noticed fd must be dup-ed before passing to io.open.
And I noticed direct test run like "py3k -m test.test_time"
still produces unicode error. (Maybe this is reasonable
limitation)
I can confirm we can suppress the unicode error in such
case with newly attached patch. "py3k_also_no_unicode_error_on_direct_test_run.patch"
|
msg118253 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-10-09 08:16 |
py3k_also_no_unicode_error_on_direct_test_run.patch comes a little bit too late:
$ LANG= ./python Lib/test/regrtest.py -v test_time
== CPython 3.2a2+ (py3k, Oct 8 2010, 01:40:20) [GCC 4.4.5 20100909 (prerelease)]
== Linux-2.6.32-trunk-686-i686-with-debian-squeeze-sid little-endian
== Traceback (most recent call last):
File "Lib/test/regrtest.py", line 1478, in <module>
main()
File "Lib/test/regrtest.py", line 454, in main
print("== ", os.getcwd())
UnicodeEncodeError: 'ascii' codec can't encode characters in position 20-21: ordinal not in range(128)
My working directory is /home/haypo/prog/SVN/py3ké.
|
msg118256 - (view) |
Author: Hirokazu Yamamoto (ocean-city) *  |
Date: 2010-10-09 08:58 |
Oops, sorry. I'll withdraw my last patch.
|
msg118395 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2010-10-11 21:50 |
> Oops, sorry. I'll withdraw my last patch.
Why? Your patch is useful to run a single test outside regrtest. But you should not remove the hack on regrtest.py, only keep your patch on unittest/runner.py. There are not exclusive.
|
msg118396 - (view) |
Author: Hirokazu Yamamoto (ocean-city) *  |
Date: 2010-10-12 00:24 |
Thank you. I'll reattach the patch only for Lib/unittest/runner.py
|
msg123605 - (view) |
Author: Hirokazu Yamamoto (ocean-city) *  |
Date: 2010-12-08 14:15 |
Well, can this go into Python3.2?
|
msg136813 - (view) |
Author: Roundup Robot (python-dev)  |
Date: 2011-05-25 00:02 |
New changeset 8be9eaf5829f by Victor Stinner in branch 'default':
Issue #8533: regrtest replaces also sys.stdout on Windows
http://hg.python.org/cpython/rev/8be9eaf5829f
|
msg137330 - (view) |
Author: STINNER Victor (vstinner) *  |
Date: 2011-05-30 21:09 |
The original issue (use backslashreplace for stdout in regrtest) is now fixed, and so I closed it.
@ocean-city: Can you please open a new issue for unittest? (for py3k_also_no_unicode_error_on_direct_test_run.patch)
|
|
Date |
User |
Action |
Args |
2022-04-11 14:57:00 | admin | set | github: 52779 |
2011-05-30 21:09:09 | vstinner | set | status: open -> closed resolution: fixed messages:
+ msg137330
|
2011-05-25 00:02:57 | python-dev | set | nosy:
+ python-dev messages:
+ msg136813
|
2010-12-08 14:15:48 | ocean-city | set | messages:
+ msg123605 |
2010-10-12 00:24:05 | ocean-city | set | files:
+ py3k_also_no_unicode_error_on_direct_test_run.patch
messages:
+ msg118396 |
2010-10-11 21:50:50 | vstinner | set | messages:
+ msg118395 |
2010-10-09 08:59:06 | ocean-city | set | files:
- py3k_also_no_unicode_error_on_direct_test_run.patch |
2010-10-09 08:58:46 | ocean-city | set | messages:
+ msg118256 |
2010-10-09 08:16:35 | vstinner | set | messages:
+ msg118253 |
2010-10-09 07:50:06 | ocean-city | set | files:
+ py3k_also_no_unicode_error_on_direct_test_run.patch
messages:
+ msg118248 |
2010-09-10 11:10:43 | ocean-city | set | files:
+ py3k_regrtest_newline_more.patch
messages:
+ msg116004 |
2010-09-10 11:08:22 | ocean-city | set | files:
+ py3k_regrtest_newline.patch nosy:
+ ocean-city messages:
+ msg116003
|
2010-05-19 20:31:32 | vstinner | unlink | issue8589 dependencies |
2010-05-07 00:59:18 | vstinner | set | messages:
+ msg105180 |
2010-05-05 21:31:09 | vstinner | set | status: closed -> open files:
+ regrtest_stdout_newline.patch resolution: fixed -> (no value) messages:
+ msg105087
|
2010-05-03 08:37:03 | vstinner | set | status: open -> closed resolution: fixed messages:
+ msg104824
|
2010-05-02 17:25:47 | vstinner | set | messages:
+ msg104794 |
2010-05-02 11:08:23 | pitrou | set | status: pending -> open
messages:
+ msg104783 |
2010-05-02 09:39:26 | vstinner | link | issue8589 dependencies |
2010-05-02 09:38:16 | vstinner | set | status: open -> pending
messages:
+ msg104773 |
2010-04-30 22:45:56 | vstinner | set | files:
- regrtest_traceback_stderr.patch |
2010-04-30 22:45:49 | vstinner | set | files:
+ regrtest_traceback_stderr-2.patch
messages:
+ msg104670 |
2010-04-26 12:49:22 | vstinner | set | messages:
+ msg104231 |
2010-04-26 12:47:23 | vstinner | set | files:
+ regrtest_traceback_stderr.patch
messages:
+ msg104229 |
2010-04-26 11:30:37 | pitrou | set | nosy:
+ pitrou, flox messages:
+ msg104223
|
2010-04-26 10:43:20 | vstinner | set | components:
+ Tests, Unicode |
2010-04-26 10:43:12 | vstinner | create | |