On Nov 8, 2010, at 9:13 AM, Ryan May wrote:
> On Thu, Nov 4, 2010 at 10:49 AM, Philip Semanchuk <[email protected]>
> wrote:
>> 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])
>
> I'm not sure how I feel about this. On one hand, it is a pain to have
> this not work under sudo. On the other, I consider the fact that $HOME
> is not set to "/root" when running as root to be a bit of a problem.
> Personally, the better solution to me would be to make sure $HOME is
> one of the variables that gets reset by sudo.
Hi Ryan,
Thanks. I don't know why sudo behaves the way it does with regard to $HOME, but
the behavior of sudo is not under my control (nor matplotlib's). Also, I expect
that *lots* of software depends on this behavior of sudo so changing it is
probably not an option.
@Matthieu --
Merci Matthieu, yours is an elegant solution. In our setup.py we're just
importing matplotlib to ensure it exists, so that fits your scenario.
The workaround I used was this --
MATPLOTLIB_CONFIG_PATH = os.path.join(os.path.expanduser('~'),
".matplotlib")
if not sys.platform.lower().startswith("win"):
if not os.path.exists(MATPLOTLIB_CONFIG_PATH):
check_matplotlib_permissions = True
# Do stuff that triggers an import of matplotlib...
if check_matplotlib_permissions:
if os.path.exists(MATPLOTLIB_CONFIG_PATH):
sudo_user = os.getenv("SUDO_USER")
if sudo_user:
subprocess.call(["chown", "-R", sudo_user,
MATPLOTLIB_CONFIG_PATH])
I think I like your idea better.
Cheers
Philip
PS - Matthieu, sorry for not quoting you directly but I was unable to subscribe
to the list before I received your mail.
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-users