Hi all,
I've run into an aspect of matplotlib's setup that seems awkward. I'm seeing 
this on Ubuntu, but I imagine it would happen on any *nix platform.

If python is running under sudo the first time matplotlib is imported, then 
matplotlib creates its config dir (~/.matplotlib) with root as the owner. 
Subsequent attempts to import matplotlib while running python as a 
non-privileged user result in this:

-----------------------------------------------------------------
RuntimeError: '/home/philip' is not a writable dir; you must set 
/home/philip/.matplotlib to be a writable dir.  You can also set environment 
variable MPLCONFIGDIR to any writable directory where you want matplotlib data 
stored 
-----------------------------------------------------------------

A simple way to re-create this -- 
1. Delete or rename ~/.matplotlib
2. sudo python -c "import matplotlib"
3. python -c "import matplotlib"


This not-improbable real-world scenario would create ~/.matplotlib owned by 
root  --
1) Download app FooBar that has matplotlib as a dependency
2) Install matplotlib
3) Run FooBar's setup.py as sudo. It imports matplotlib, perhaps just to ensure 
that matplotlib is installed and working.


We ran into a similar situation with our app ('sudo python setup.py install' 
created desktop icons owned by root) and we resolved it by invoking chown after 
using a getenv() call to sniff out who we really wanted to own the file. 

It looks like the diff below (untested!) applied to lib/matplotlib/__init__.py 
would prevent this from happening. Does it seems reasonable to add it?

474a475,485
>         if not sys.platform.lower().startswith("win"):
>             # Ensure that we didn't just create a root-owned directory in the 
>             # user's HOME directory. That happens if this is being run under 
>             # sudo. If the SUDO_USER env. var (which contains the user that 
>             # invoked sudo) then we're running under sudo. If it doesn't 
>             # exist, we're not running under sudo.
>             current_user = os.getenv("SUDO_USER")
>             if current_user:
>                 subprocess.call(["chown", "-R", current_user, p])


Thanks
Philip



------------------------------------------------------------------------------
The Next 800 Companies to Lead America's Growth: New Video Whitepaper
David G. Thomson, author of the best-selling book "Blueprint to a 
Billion" shares his insights and actions to help propel your 
business during the next growth cycle. Listen Now!
http://p.sf.net/sfu/SAP-dev2dev
_______________________________________________
Matplotlib-users mailing list
Matplotlib-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/matplotlib-users

Reply via email to