0

最近我发生了一个奇怪的问题。

我的操作系统是Gentoo. 我安装了pipand layman,但是 /usr/bin: /usr/bin/pipand中的二进制文件/usr/bin/layman都是.softlink/usr/bin/python-exec

% ll /usr/bin/{pip,layman}
lrwxrwxrwx 1 root root 11 Sep 18 23:51 /usr/bin/layman -> python-exec
lrwxrwxrwx 1 root root 11 Aug 16 08:14 /usr/bin/pip -> python-exec

的内容/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')()
) 

我发现这个文件属于dev-python/python-exec-0.3.1

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

这个包是:

*  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

不知道/usr/bin/python-exec脚本的作用是什么?

以及为什么/usr/bin/pip/usr/bin.layman将软链接到这个脚本?

现在如果我想使用pip安装包或layman管理覆盖,我应该使用/usr/bin/pip-python2.7and layman-python2.7.

4

2 回答 2

2

python-exec 是一个特定于 Gentoo 的包装脚本,它调用适合当前所选 Python 运行时的请求脚本的实现。这使得 Gentoo 能够支持在 Python 运行时之间切换而不会破坏脚本,只要所选运行时存在兼容版本的脚本即可。

于 2014-08-02T02:04:55.030 回答
0

我阅读了 python-exec 工具的帮助信息。

我认为这是一个 pygment wapper。有格式化程序、过滤器等。

所以如果我使用:

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

它将输入写入 /tmp/test.file,并使用 pygments 使代码着色。

但是为什么 pip 和外行会软链接到它,我仍然不知道。

附加:

我找到了原因:

出于某种原因,另一个应用程序会覆盖/usr/bin/python-exec. (我想也许是 pygments。)

正确的内容是:

#!/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)

而且很多二进制文件,比如pip,layman都会软链接到它,它是一个简单的包装器。

于 2013-09-19T03:01:36.053 回答