views:

86

answers:

1

Hi folks,

I'd like to use lxml library to validate XML Schemas in Python 3.1.2.

Since the Snow Leopard MAC OS comes with the Python 2.6.1 installed, firstly, I downloaded the Python 3.1.2 automated installer at http://www.python.org/ftp/python/3.1.2/python-3.1.2-macosx10.3-2010-03-24.dmg and installed it.

Secondly, I downloaded lxml 2.2.6 at http://pypi.python.org/packages/source/l/lxml/lxml-2.2.6.tar.gz, unpacked it and performed the installation as stated in http://wiki.python.org/moin/CheeseShopTutorial (i.e.:)

  $ cd lxml-2.2.6
  $ python setup.py install

It installed the package with no troubles at my Python 2.6 distribution site-packages directory (/Library/Python/2.6/site-packages), but I'd like to have it installed in my Python 3.1 distribution site-packages directory (/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/site-packages).

I tried to replace python setup.py install with python3 setup.py install, but I've got a lot of error messages in the console. Installing the lxml by using easy_install lxml had the same effect.

As a last resort, I tried simply to move the content of the Python 2.6 distribution site-packages directory to the Python 3.1 distribution site-packages directory and run a test script like this:

try:
    from lxml import etree
    print("running with lxml.etree")
except ImportError:
    try:
        # Python 2.5
        import xml.etree.cElementTree as etree
        print("running with cElementTree on Python 2.5+")
    except ImportError:
        try:
            # Python 2.5
            import xml.etree.ElementTree as etree
            print("running with ElementTree on Python 2.5+")
        except ImportError:
            try:
                # normal cElementTree install
                import cElementTree as etree
                print("running with cElementTree")
            except ImportError:
                try:
                    # normal ElementTree install
                    import elementtree.ElementTree as etree
                    print("running with ElementTree")
                except ImportError:
                    print("Failed to import ElementTree from any known place")


schema_root = etree.parse('note.xsd').getroot()
schema = etree.XMLSchema(schema_root)
parser = etree.XMLParser(schema = schema)
root = etree.parse('note.xml', parser)

And I got this error message in the console:

Traceback (most recent call last):
  File "/Users/eduardo/Workspace/PythonToolbox/TestProject/src/testproject/domparse.py", line 97, in <module>
    schema = etree.XMLSchema(schema_root)
AttributeError: 'module' object has no attribute 'XMLSchema'
running with cElementTree on Python 2.5+

As suggested by Ned Deily, I did the following:

$ curl http://pypi.python.org/packages/source/l/lxml/lxml-2.2.6.tar.gz | tar xz 
$ cd lxml-2.2.6
$ python3 setup.py install

But I've got some compiler error messages, the file http://www.educoelho.com/files/output.txt

How can I get lxml running in Python 3.1?

Thanks in advance.

+1  A: 

If you are going to build lxml from source, you need to build it entirely with the desired Python. And, in general, you cannot just move site-packages from one Python instance to another, especially Python 2 vs Python 3. First, undo whatever copy or move you did into the Python 3 site-packages directory. If you are not sure what you did, you should consider re-installing Python 3.1. Now start with a clean copy of the lxml source from the tar file and try building it with python3.1:

$ rm -r lxml-2.2.6
$ curl http://pypi.python.org/packages/source/l/lxml/lxml-2.2.6.tar.gz | tar xz 
$ cd lxml-2.2.6
$ python3 setup.py install

If you get errors, update your question to show exactly what error messages appear.

EDIT: The relevant error message is this one:

Compiling with an SDK that doesn't seem to exist: /Developer/SDKs/MacOSX10.4u.sdk

Most python.org pythons are built to work on several versions of OS X so they use the optional 10.4 SDK. Apple's Xcode installer for 10.6 Snow Leopard includes the 10.4u SDK but it is not installed by default. You need to install it using the Xcode installer (on the Snow Leopard DVD or that came with a new Mac or download from the Apple Developer Connection).

Ned Deily
Hey Ned, appreciate your reply. I'll edit the question showing the error message.
Eduardo Coelho
Ah, see the edited answer above.
Ned Deily
Thank you Ned Deily! I downloaded the latest version of the SDK (xcode_3.2.3_and_iphone_sdk_4__final.dmg) and re-installed the XCode/SDK with the MacOSX10.4u.sdk checkbox marked (which is not by default). Now my /Developer/SDKs directory also has the MacOSX10.4u.sdk. I repeated your installation steps and now lxml is working properly in Python 3.1.2. Thanks!
Eduardo Coelho