Câu hỏi Sys.path của Python được khởi tạo từ đâu?


Sys.path của Python được khởi tạo từ đâu?

UPD: Python đang thêm một số đường dẫn trước khi tham chiếu đến PYTHONPATH:

    >>> import sys
    >>> from pprint import pprint as p
    >>> p(sys.path)
    ['',
     'C:\\Python25\\lib\\site-packages\\setuptools-0.6c9-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\orbited-0.7.8-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\morbid-0.8.6.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\demjson-1.4-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\stomper-0.2.2-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\uuid-1.30-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\stompservice-0.1.0-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\cherrypy-3.0.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\pyorbited-0.2.2-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\flup-1.0.1-py2.5.egg',
     'C:\\Python25\\lib\\site-packages\\wsgilog-0.1-py2.5.egg',
     'c:\\testdir',
     'C:\\Windows\\system32\\python25.zip',
     'C:\\Python25\\DLLs',
     'C:\\Python25\\lib',
     'C:\\Python25\\lib\\plat-win',
     'C:\\Python25\\lib\\lib-tk',
     'C:\\Python25',
     'C:\\Python25\\lib\\site-packages',
     'C:\\Python25\\lib\\site-packages\\PIL',
     'C:\\Python25\\lib\\site-packages\\win32',
     'C:\\Python25\\lib\\site-packages\\win32\\lib',
     'C:\\Python25\\lib\\site-packages\\Pythonwin']

PYTHONPATH của tôi là:

    PYTHONPATH=c:\testdir

Tôi tự hỏi những con đường đó trước khi những con đường của PYTHONPATH đến từ đâu?


76
2018-05-22 13:19


gốc




Các câu trả lời:


"Được khởi tạo từ biến môi trường PYTHONPATH, cộng với một mặc định phụ thuộc vào cài đặt"

- - http://docs.python.org/library/sys.html#sys.path


37
2018-05-22 13:21



Tôi đoán họ đến từ mô-đun trang web: docs.python.org/library/site.html - ashcatch
Mô-đun trang tải và phân tích nội dung của bất kỳ tệp .pth nào trong thư mục gói trang web của bạn. Các tệp .pth này chứa các phần bổ sung vào PYTHONPATH của bạn - ASk


Python thực sự cố gắng hết sức để thiết lập một cách thông minh sys.path. Nó thế nào thiết lập có thể nhận được có thật không  phức tạp. Hướng dẫn sau đây được tưới nước, hướng dẫn có phần không đầy đủ, hơi sai, nhưng hy vọng hữu ích cho người lập trình python xếp hạng và tập tin về những gì xảy ra khi python tìm ra những gì để sử dụng như giá trị ban đầu của sys.path, sys.executable, sys.exec_prefixsys.prefix trên một bình thường cài đặt python.

Đầu tiên, python thực hiện tốt nhất cấp độ của nó để tìm ra vật lý thực tế của nó vị trí trên hệ thống tệp dựa trên những gì hệ điều hành cho biết nó. Nếu hệ điều hành chỉ nói "python" đang chạy, nó tìm thấy chính nó trong $ PATH. Nó giải quyết bất kỳ liên kết tượng trưng nào. Một khi nó đã làm điều này, con đường của thực thi mà nó tìm thấy được sử dụng làm giá trị cho sys.executable, không có ifs, ands, hoặc buts.

Tiếp theo, nó xác định giá trị ban đầu cho sys.exec_prefix và   sys.prefix.

Nếu có một tập tin gọi là pyvenv.cfg trong cùng thư mục với sys.executable hoặc một thư mục lên, python nhìn vào nó. Khác nhau Hệ điều hành làm những việc khác nhau với tệp này.

Một trong các giá trị trong tệp cấu hình này mà python tìm kiếm là tùy chọn cấu hình home = <DIRECTORY>. Python sẽ sử dụng thư mục này thay vì thư mục chứa sys.executable khi nó tự động đặt giá trị ban đầu của sys.prefix một lát sau. Nếu applocal = true cài đặt xuất hiện trong pyvenv.cfg tệp trên Windows, nhưng không phải tệp home = <DIRECTORY> cài đặt, sau đó sys.prefix sẽ được đặt thành thư mục chứa sys.executable.

Tiếp theo, PYTHONHOME biến môi trường được kiểm tra. Trên Linux và Mac, sys.prefix và sys.exec_prefix được đặt thành PYTHONHOME biến môi trường, nếu nó có tồn tại, thay thế bất kì home = <DIRECTORY> thiết lập trong pyvenv.cfg. Trên Windows, sys.prefix và sys.exec_prefix được đặt thành PYTHONHOME biến môi trường, nếu nó tồn tại, trừ khi một home = <DIRECTORY> cài đặt hiện diện trong pyvenv.cfg, được sử dụng thay thế.

Nếu không, những sys.prefix và sys.exec_prefix được tìm thấy bằng cách đi bộ về phía sau từ vị trí của sys.executable, hoặc là home thư mục được đưa ra bởi pyvenv.cfg nếu có.

Nếu tập tin lib/python<version>/dyn-load được tìm thấy trong thư mục đó hoặc bất kỳ thư mục mẹ nào của nó, thư mục đó được thiết lập để trở thành sys.exec_prefix trên Linux hoặc Mac. Nếu tập tin lib/python<version>/os.py được tìm thấy trong thư mục hoặc bất kỳ thư mục con, thư mục đó được đặt thành sys.prefix trên Linux, Mac và Windows, với sys.exec_prefix đặt thành cùng một giá trị như sys.prefix trên Windows. Toàn bộ bước này được bỏ qua trên Windows nếu applocal = true được đặt. Hoặc là thư mục của sys.executable Là được sử dụng hoặc, nếu home được đặt trong pyvenv.cfg, được sử dụng thay thế cho giá trị ban đầu của sys.prefix.

Nếu không thể tìm thấy các tệp "mốc" này hoặc sys.prefix chưa từng tìm thấy, sau đó bộ python sys.prefix đến một "dự phòng" giá trị. Ví dụ, Linux và Mac, sử dụng các giá trị mặc định được biên dịch trước như giá trị của sys.prefix và sys.exec_prefix. Windows chờ đợi cho đến sys.path được tìm ra hoàn toàn để đặt giá trị dự phòng cho sys.prefix.

Sau đó, (tất cả những gì bạn đã chờ đợi), python xác định các giá trị ban đầu được chứa trong sys.path.

  1. Thư mục của tập lệnh mà python đang thực hiện được thêm vào sys.path. Trên Windows, đây luôn là chuỗi rỗng, cho biết python sử dụng thư mục làm việc hiện tại để thay thế.
  2. Nội dung của biến môi trường PYTHONPATH, nếu được đặt, được thêm vào sys.path, trừ khi bạn là trên Windows và applocal được đặt thành true trong pyvenv.cfg.
  3. Đường dẫn tệp zip, là <prefix>/lib/python35.zip trên Linux / Mac và os.path.join(os.dirname(sys.executable), "python.zip") trên Windows, được thêm vào sys.path.
  4. Nếu trên Windows và không applocal = true được đặt trong pyvenv.cfg, sau đó nội dung của các khóa con của khóa đăng ký HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ được thêm vào, nếu có.
  5. Nếu trên Windows và không applocal = true được đặt trong pyvenv.cfgsys.prefix không thể tìm thấy, sau đó nội dung cốt lõi của khóa đăng ký HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ được thêm vào, nếu nó tồn tại;
  6. Nếu trên Windows và không applocal = true được đặt trong pyvenv.cfg, sau đó nội dung của các khóa con của khóa đăng ký HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\ được thêm vào, nếu có.
  7. Nếu trên Windows và không applocal = true được đặt trong pyvenv.cfgsys.prefix không thể tìm thấy, sau đó nội dung cốt lõi của khóa đăng ký HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\ được thêm vào, nếu nó tồn tại;
  8. Nếu trên Windows và PYTHONPATH không được đặt, tiền tố không được tìm thấy và không có khóa đăng ký nào, thì giá trị biên dịch tương đối của PYTHONPATH được thêm vào; nếu không, bước này sẽ bị bỏ qua.
  9. Đường dẫn trong macro biên dịch thời gian PYTHONPATH được thêm vào tương ứng với tìm thấy động sys.prefix.
  10. Trên Mac và Linux, giá trị của sys.exec_prefix được thêm vào. Trên Windows, thư mục đã được sử dụng (hoặc sẽ được sử dụng) để tìm kiếm động cho sys.prefix Là thêm.

Ở giai đoạn này trên Windows, nếu không tìm thấy tiền tố, thì python sẽ cố gắng xác định nó bằng cách tìm kiếm tất cả các các thư mục trong sys.path cho các tệp mốc, như nó đã cố gắng thực hiện với thư mục sys.executable trước đó, cho đến khi nó tìm thấy một cái gì đó. Nếu không, sys.prefix để trống.

Cuối cùng, sau khi tất cả điều này, Python tải site mô-đun, bổ sung thêm nội dung sys.path:

Nó bắt đầu bằng cách xây dựng tối đa bốn thư mục từ một đầu và một   phần đuôi. Đối với phần đầu, nó sử dụng sys.prefix và sys.exec_prefix;   đầu trống bị bỏ qua. Đối với phần đuôi, nó sử dụng chuỗi rỗng   và sau đó lib/site-packages (trên Windows) hoặc lib/pythonX.Y/site-packages   và sau đó lib/site-python (trên Unix và Macintosh). Đối với mỗi   kết hợp đuôi đầu khác biệt, nó sẽ thấy nếu nó đề cập đến   và nếu có, hãy thêm nó vào sys.path và cũng kiểm tra mới   thêm đường dẫn cho tệp cấu hình.


36
2017-07-15 19:19



Mặc dù tài liệu của nó nói gì, sys.executable có thể là một liên kết tượng trưng hoặc thực sự nó có thể là bất cứ điều gì nếu argv[0] chứa dấu gạch chéo. Thực tế con đường để thực thi (từ execv(path, argv) cuộc gọi) không được sử dụng. - jfs