[Pywikipedia-l] Stress Python 3 incompatibility

Nicolas Dumazet nicdumz at gmail.com
Sat May 9 04:02:38 UTC 2009


Hello!

It apparently happens often that some people install Python 3 and try
to run pywikipedia.
pywikipedia then fails ungracefully, with unclear Syntax Errors,
because of syntax changes:

1) Calling login.py
$ python3 login.py
  File "login.py", line 61
    'en': u'Wikipedia:Registered bots',
                                     ^
SyntaxError: invalid syntax

2) Importing wikipedia
$ python3
Python 3.0.1+ (r301:69556, Apr 15 2009, 15:59:22)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import wikipedia
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "wikipedia.py", line 354
    raise InvalidTitle(u'Bad page title : %s' % t)
                                            ^
SyntaxError: invalid syntax

Beginner users then understand that pywikipedia is broken :)
I tried to fix this issue today, to at least be able to output some
meaningful info when Python3 dies.
Problem:
Because Python3 fails on Syntax Errors, no imports are processed, and
no code is ever interpreted: the parser first parses the code, raising
Syntax Errors, and then only starts interpreting the code. It makes
this issue troublesome.

I came up with this patch:

Index: login.py
===================================================================
--- login.py	(revision 6857)
+++ login.py	(working copy)
@@ -50,7 +50,11 @@
 #
 __version__='$Id$'

-import re
+import re, sys
+
+if sys.version >= '3':
+    print 'Python 3.x is _not_ supported. Use Python 2.x'
+
 import urllib2
 import wikipedia, config

Index: wikipedia.py
===================================================================
--- wikipedia.py	(revision 6858)
+++ wikipedia.py	(working copy)
@@ -123,6 +123,10 @@
 __version__ = '$Id$'

 import os, sys
+
+if sys.version >= '3':
+    print 'Python 3.x is _not_ supported. Use Python 2.x'
+
 import httplib, socket, urllib
 import traceback
 import time, threading, Queue

1) Calling login.py

Behavior after:
$ python3 login.py
  File "login.py", line 56
    print 'Python 3.0 is _not_ supported. Use Python 2.x'
                                                        ^
SyntaxError: invalid syntax

2) Importing wikipedia:

$ python3
Python 3.0.1+ (r301:69556, Apr 15 2009, 15:59:22)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import wikipedia
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "wikipedia.py", line 128
    print 'Python 3.0 is _not_ supported. Use Python 2.x'
                                                        ^
SyntaxError: invalid syntax

As you see, Python3 will still fail on a syntax error.
The hackish, bad-looking "trick" is only to make it fail on a line
that shows, in a text message, what's wrong.


Do you have any better suggestions on how to do this?

I need to document the "hack" in the code of course, I just included a
minimal patch for the mailing list.
I thought adding this check in wikipedia.py ; and in login.py : they
seem to be the first entry points. Should I add it somewhere else?
test.py maybe?

Thanks!

-- 
Nicolas Dumazet — NicDumZ [ nɪk.d̪ymz ]



More information about the Pywikipedia-l mailing list