2013-05-02 42 views
5

Tôi đang biên soạn một số phiên bản Python khác nhau cho hệ thống của mình và tôi muốn biết vị trí trong mã nguồn mà biểu ngữ khởi động được xác định để tôi có thể thay đổi nó cho mỗi phiên bản. Ví dụ, khi người phiên dịch bắt đầu nó sẽ hiển thịBiểu ngữ khởi động Python được xác định ở đâu?

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. 
>>> 

Tôi muốn thay đổi chuỗi default đến những thứ khác để báo hiệu phiên bản tôi đang sử dụng, nhưng tôi cũng quan tâm đến cách toàn bộ công việc được lắp ráp . Nó được định nghĩa ở đâu?

+0

Có thể bạn nên nhập mã cho '__DATE__' hoặc' __TIME__' để truy cập mã có liên quan. –

+0

Bạn có thể sử dụng mã này để thay đổi những gì trình thông dịch hiển thị - python -ic 'import sys; sys.ps1 = "$"; sys.ps2 = "" ' – fixxxer

Trả lời

14

Hãy sử dụng grep để tham gia vào sân chơi bóng chày. Tôi sẽ không bận tâm tìm kiếm default vì tôi sẽ nhận được quá nhiều kết quả, nhưng tôi sẽ thử Type "Help", không được xuất hiện quá nhiều lần. Nếu đó là một chuỗi C, các dấu ngoặc kép sẽ được thoát. Chúng ta nên tìm kiếm các chuỗi C đầu tiên và Python sau này.

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

It's in Modules/main.c, in Py_Main(). Hơn đào ban cho chúng ta dòng này:

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

Bởi vì "trên" là trong chuỗi định dạng, Py_GetPlatform() phải linuxPy_GetVersion() phải cung cấp cho chuỗi chúng tôi muốn ...

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

Điều đó có vẻ đầy hứa hẹn. ..

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

Chúng ta phải muốn Py_GetBuildInfo(), bởi vì nó bên trong dấu ngoặc đơn ...

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

Điều đó có vẻ hơi quá rõ ràng.

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; 
} 

Vì vậy, default là tên của chi nhánh Mercurial. Bằng cách kiểm tra các makefiles, chúng ta có thể tìm ra rằng điều này xuất phát từ macro HGTAG. Biến makefile có tên là HGTAG tạo biến và biến đó được chạy dưới dạng lệnh. Vì vậy,

giải pháp đơn giản

Khi xây dựng 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

Có thể đáng nói đến là phần đầu tiên của đầu ra là chuỗi phiên bản Python như được trả về bởi 'Py_GetVersion'. Các công cụ trong ngoặc đơn (bao gồm 'default') là một phần của chuỗi được trả về bởi' Py_GetBuildInfo', điều này gợi ý cho tôi rằng nó có thể được tinh chỉnh tại thời gian biên dịch. – Blckknght

+0

@Blckknght: Đúng vậy, tôi đang đứng đầu ... –

+0

Làm tốt việc viết bài đăng này như một câu chuyện trinh thám. Làm cho đọc ly kỳ! – LondonRob

0

Hình như nếu bạn thêm một thẻ lanh lợi trước khi bạn xây dựng, sau đó default sẽ được thay thế bằng tên của thẻ của bạn (nguồn: Modules/getbuildinfo.c : _Py_hgidentifier())

Về cơ bản có vẻ như nó chọn tên default vì đó là tên của chi nhánh. Có vẻ như trình thông dịch được tạo bằng tên thẻ, nếu có, hoặc tên của chi nhánh nếu không có thẻ (bên cạnh tip) tồn tại trên bản sao làm việc hiện tại.

Các vấn đề liên quan