On Wed, Jul 9, 2008 at 8:11 PM, David Philp <[EMAIL PROTECTED]> wrote:
>
>
> This is a 'for the record' email describing how to use boost.python
> with sage on Mac OS X. Thanks to the gentlefolk who walked me through
> it (especially Carl Witty).
>
> I am assuming a working boost.python extension called 'my_ext.so'.
> "Working" means that you should be able to start up python at the
> command line, run "import my_ext" and call your functions /
> instantiate classes etc.
>
> Attempting to do the same with sage fails.  Start sage, run "import
> my_ext" and it will fail with a message like
> ImportError: dlopen(./my_ext.so, 2): Symbol not found:
> _PyUnicodeUCS2_AsWideChar
>
> The problem is that the version of python distributed inside sage uses
> UCS4 (for consistency with linux) rather than UCS2 (which is used by
> Apple's system python).  Because libboost_python is compiled against
> Apple's Python, it assumes UCS2.  There are two possible fixes: (1)
> recompile boost against sage's python, and it will use UCS4.  (2)
> Recompile sage to use UCS2.
>
> The second option is better for me, because I want my python
> extensions binary compatible with both system python and sage python.
> (The alternative is to have system & sage versions of boost, and
> system & sage versions of every extension.)  Changing sage's default
> unicode setting might have consequences that I don't understand, but I
> haven't been bitten yet.

It should be fine. We used UCS2 until maybe 8 months ago.  We switched
as mentioned above only for Linux compatibility.

> You will need to do this for each successive
> version of sage, which could be tedious.

I would be ok with making an environment variable, e.g., SAGE_UCS2
that if set causes SAGE to build using UCS2.

Alternatively, we could make Sage on OS X use UCS2 but Sage on
Linux use UCS4.

>
> ===== Rebuilding sage with UCS2 =====
>
> Sage needs to be rebuilt from source, with python using the option --
> enable-unicode=ucs2 instead of --enable-unicode=ucs4
>
> To do this:
> 1. download the sage source,
> 2. extract it:
> tar xf sage-3.0.3.tar
>
> 3. find the sage packages
> cd sage-3.0.3/spkg/standard
>
> 4. open up the python spkg:
> tar xjf python-2.5.2.p2.spkg
>
> 5. open the file python-2.5.2.p2/spkg-install
> open -e python-2.5.2.p2/spkg-install
>
> 6. find two instances of "--enable-unicode=ucs4" and replace them with
> "--enable-unicode=ucs2"
>
> 7. recreate the spkg:
> tar cjf python-2.5.2.p2.spkg python-2.5.2.p2/
>
> 8. Then return to the main sage directory, and build sage
> cd ../../
> make
>
>
> Once it's built, starting sage and importing my_ext should work.
>
>
> ==== other issues with boost.python ====
>
> boost.python does not automagically convert sage values to ints or
> floats---for example, assume you have made the following accessible to
> python:
> struct s_type {
>  int n;
>  void set_x(double x);
> }
>
> Running
> s_inst = my_ext.s_type()
> will work, but
>
> s_inst.n = 1
> will fail with a message like
> ArgumentError: Python argument types in
>    None.None(s_type, sage.rings.integer.Integer)
> did not match C++ signature:
>    None(s_type {lvalue}, int)
>
> s_inst.set_x(3)
> will similarly fail.
>
> There are various fixes, including:
> s_inst.n = int(1)
> s_inst.set_x(float(3))
>
> Another option is to switch off the sage preparser:
> preparser(False)
> s_inst.n = 1
> preparser(True)
>
>
>
> >
>



-- 
William Stein
Associate Professor of Mathematics
University of Washington
http://wstein.org

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to