2013-05-02 17 views
5

मैं अपने सिस्टम के लिए पाइथन के कई अलग-अलग संस्करणों को संकलित कर रहा हूं, और मैं जानना चाहता हूं कि स्रोत में कहां स्टार्टअप बैनर परिभाषित किया गया है, इसलिए मैं इसे प्रत्येक संस्करण के लिए बदल सकता हूं। उदाहरण के लिए, जब दुभाषिया शुरू होता है यह प्रदर्शित करता हैपाइथन स्टार्टअप बैनर कहां परिभाषित किया गया है?

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__' के लिए एएके कर सकते हैं। –

+0

आप इस कोड का उपयोग दुभाषिया शो को बदलने के लिए कर सकते हैं - पायथन-'आयात sys; sys.ps1 = "$"; sys.ps2 = "" ' – fixxxer

उत्तर

14

चलो बॉलपार्क में जाने के लिए grep का उपयोग करें। मैं default के लिए खोज करने की परेशानी नहीं कर रहा हूं क्योंकि मुझे बहुत सारे परिणाम मिलेंगे, लेकिन मैं Type "Help" का प्रयास करूंगा, जो कई बार प्रकट नहीं होना चाहिए। यदि यह एक सी स्ट्रिंग है, तो उद्धरण बच जाएंगे। हमें पहले सी स्ट्रिंग्स और पाइथन स्ट्रिंग्स को देखना चाहिए।

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

यह Py_Main() में Modules/main.c में है,।

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

क्योंकि "पर" प्रारूप स्ट्रिंग में है, Py_GetPlatform()linux होना चाहिए और Py_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 मर्क्युरियल शाखा का नाम है। मेकफ़ाइल की जांच करके, हम यह पता लगा सकते हैं कि यह मैक्रो HGTAG से आता है। HGTAG नामक एक मेकफ़ाइल चर वैरिएबल उत्पन्न करता है, और वह चर कमांड के रूप में चलाया जाता है। तो,

सरल समाधान

जब अजगर का निर्माण,

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' द्वारा लौटाया गया है। कोष्ठक ('default' सहित) में सामग्री 'Py_GetBuildInfo' द्वारा लौटाई गई स्ट्रिंग का हिस्सा है, जो मुझे बताती है कि इसे संकलित समय पर शायद tweaked किया जा सकता है। – Blckknght

+0

@ ब्लैकनघट: यह सही है जहां मैं नेतृत्व कर रहा हूं ... –

+0

अच्छी तरह से इस पोस्ट को एक जासूसी कहानी की तरह लिखने के लिए किया गया। रोमांचकारी पढ़ने के लिए बनाता है! – LondonRob

0

लग रहा है अगर आप एक तेज टैग को जोड़ने से पहले आप का निर्माण, तो default अपने टैग के नाम के साथ प्रतिस्थापित किया जाएगा की तरह (स्रोत: Modules/getbuildinfo.c : _Py_hgidentifier())

असल में ऐसा लगता है कि यह default नाम चुनता है क्योंकि यह शाखा का नाम है। ऐसा लगता है कि दुभाषिया टैग नाम के साथ बनाया गया है, यदि कोई मौजूद है, या शाखा का नाम यदि कोई टैग नहीं है (tip के अलावा) वर्तमान कार्यशील प्रति पर मौजूद है।

संबंधित मुद्दे