2013-05-02 37 views
5

我正在为我的系统编译几个不同版本的Python,并且我想知道源代码中的起始横幅是在哪里定义的,所以我可以为每个版本更改它。例如,解释器启动时,它会显示Python启动横幅在哪里定义?

Python 3.3.1 (default, Apr 28 2013, 10:19:42) 
[GCC 4.7.2 20121109 (Red Hat 4.7.2-8)] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

我想串default切换到其他事物的信号,我使用的版本,但我也有兴趣在整个事情是如何组装的。这个定义在哪里?

+0

您可能需要查看'__DATE__'或'__TIME__'来获取相关的代码。 – 2013-05-02 04:06:47

+0

您可以使用此代码来更改解释器显示的内容 - python -ic'import sys; sys.ps1 =“$”; sys.ps2 =“”' – fixxxer 2013-05-02 04:09:44

回答

14

让我们使用grep进入大球场。我不打算搜索default,因为我会得到太多结果,但我会尝试Type "Help",这不应该出现太多次。如果它是C字符串,则引号将被转义。我们应该首先查找C字符串,然后再查找Python字符串。

Python $ grep 'Type \\"help\\"' . -Ir 
./Modules/main.c: "Type \"help\", \"copyright\", \"credits\" or \"license\" " \ 

它在Modules/main.c,在Py_Main()。更多挖给了我们这一行:

fprintf(stderr, "Python %s on %s\n", 
    Py_GetVersion(), Py_GetPlatform()); 

因为“的”为格式字符串,Py_GetPlatform()必须linuxPy_GetVersion()必须给我们想要的字符串......

Python $ grep Py_GetVersion . -Irl 
... 
./Python/getversion.c 
... 

这看起来很有希望。 ..

PyOS_snprintf(version, sizeof(version), "%.80s (%.80s) %.80s", 
       PY_VERSION, Py_GetBuildInfo(), Py_GetCompiler()); 

我们必须要Py_GetBuildInfo(),因为它的括号内...

Python $ grep Py_GetBuildInfo . -Irl 
... 
./Modules/getbuildinfo.c 
... 

这看起来有点太明显。

const char * 
Py_GetBuildInfo(void) 
{ 
    static char buildinfo[50 + sizeof(HGVERSION) + 
          ((sizeof(HGTAG) > sizeof(HGBRANCH)) ? 
          sizeof(HGTAG) : sizeof(HGBRANCH))]; 
    const char *revision = _Py_hgversion(); 
    const char *sep = *revision ? ":" : ""; 
    const char *hgid = _Py_hgidentifier(); 
    if (!(*hgid)) 
     hgid = "default"; 
    PyOS_snprintf(buildinfo, sizeof(buildinfo), 
        "%s%s%s, %.20s, %.9s", hgid, sep, revision, 
        DATE, TIME); 
    return buildinfo; 
} 

因此,default是Mercurial分支的名称。通过检查makefiles,我们可以发现这是来自宏HGTAG。一个名为HGTAG的makefile变量产生变量,并且该变量作为命令运行。所以,

简单的解决方案

当构建的Python,

Python $ ./configure 
Python $ make HGTAG='echo awesome' 
Python $ ./python 
Python 3.2.3 (awesome, May 1 2013, 21:33:27) 
[GCC 4.7.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 
+0

值得一提的是,输出的第一部分是'Py_GetVersion'返回的Python版本字符串。括号内的东西(包括'default')是由'Py_GetBuildInfo'返回的字符串的一部分,这表明它可以在编译时调整。 – Blckknght 2013-05-02 04:18:15

+0

@Blckknght:这就是我要去的地方... – 2013-05-02 04:22:54

+0

写得好像是一个侦探故事。让阅读惊心动魄! – LondonRob 2015-07-07 22:45:27

0

看起来,如果你添加一个善变的标签你建立之前,然后default将与您标签的名称所取代(来源:Modules/getbuildinfo.c_Py_hgidentifier()

基本上好像它选择的名称default,因为这是该分支的名称。看起来解释器是用标签名称(如果存在的话)构建的,或者如果在当前工作副本上不存在标签(除了tip),则分支的名称。