Blog·Tanky WooABOUTRSS

A strange python-exec problems

19 Sep 2013

Many python tools in /usr/bin is a softlink to /usr/bin/python-exec:

$ ll /usr/bin | grep python-exec
lrwxrwxrwx   1 root root          11 Apr 24 22:24 django-admin.py -> python-exec
lrwxrwxrwx   1 root root          11 Apr  4 15:44 easy_install -> python-exec
lrwxrwxrwx   1 root root          11 Sep 18 23:51 layman -> python-exec
lrwxrwxrwx   1 root root          11 Sep 18 23:51 layman-updater -> python-exec
lrwxrwxrwx   1 root root          11 Jun 18 08:00 markdown2 -> python-exec
lrwxrwxrwx   1 root root          11 Sep 19 11:51 pip -> python-exec
lrwxrwxrwx   1 root root          11 Apr 24 22:09 pygmentize -> python-exec
-rwxr-xr-x   1 root root        1397 Sep 19 11:50 python-exec
-rwxr-xr-x   1 root root       10320 Sep 19 11:50 python-exec-c
...

I use pip and layman, and find they are strange.

The content of /usr/bin/python-exec:

#!/usr/bin/python2.7
# EASY-INSTALL-ENTRY-SCRIPT: 'Pygments==1.6','console_scripts','pygmentize'
__requires__ = 'Pygments==1.6'
import sys
from pkg_resources import load_entry_point

sys.exit(
    load_entry_point('Pygments==1.6', 'console_scripts', 'pygmentize')()
)

First I check this script:

% equery belongs python-exec
 * Searching for python-exec ... 
dev-python/python-exec-0.3.1 (/usr/bin/python-exec)

Find it belongs to dev-python/python-exec-0.3.1.

And the package info:

*  dev-python/python-exec
      Latest version available: 0.3.1
      Latest version installed: 0.3.1
      Size of files: 72 kB
      Homepage:      https://bitbucket.org/mgorny/python-exec/
      Description:   Python script wrapper
      License:       BSD

Then I read the help information of this script, the function of this script is to pymentize the codesnippet.

$ python-exec -l python -f html -o /tmp/test.file
#this is the input#
print 'hello world'
....

Ctrl-d to eof input.

It will write the input to /tmp/test.file, and use pygments to colorful the code.

I check the python-exec package code source, be sure this is not the right content.

The right content:

#!/usr/bin/python-exec-c
# vim:fileencoding=utf-8:ft=python
# (c) 2012 Michał Górny
# Released under the terms of the 2-clause BSD license.
#
# This is not the script you are looking for. This is just a wrapper.
# The actual scripts of this application were installed with -python*,
# -pypy* or -jython* suffixes. You are most likely looking for one
# of those.

from __future__ import with_statement
import os, os.path, sys

try:
    from epython import EPYTHON
except ImportError:
    EPYTHON = os.path.basename(sys.executable)
    if '' and EPYTHON.endswith(''):
        EPYTHON = EPYTHON[:-len('')]

# In the loop:
# sys.argv[0] keeps the 'bare' name
# __file__ keeps the 'full' name

while True:
    __file__ = sys.argv[0] + '-' + EPYTHON

    try:
        kwargs = {}
        if sys.version_info[0] >= 3:
            import tokenize

            # need to provide encoding
            with open(__file__, 'rb') as f:
                kwargs['encoding'] = tokenize.detect_encoding(f.readline)[0]

        with open(__file__, 'r', **kwargs) as f:
            data = f.read()
    except IOError:
        # follow symlinks (if supported)
        try:
            sys.argv[0] = os.path.join(os.path.dirname(sys.argv[0]),
                    os.readlink(sys.argv[0]))
        except (OSError, AttributeError):
            # no more symlinks? then it's time to fail.
            sys.stderr.write('This Python implementation (%s) is not supported by the script.\n'
                    % EPYTHON)
            sys.exit(127)
    else:
        break

sys.argv[0] = __file__
exec(data)

It is a simple wrapper to wrap python tools under /usr/bin.

For some reason(I have not found), another software(maybe pygments) overwrite the /usr/bin/python-exec.

Reinstall python-exec and solve this strange problem:

emerge -avD python-exec

Disable python-exec to be changed by other package:

emerge --oneshort python-exec:2