Python thực sự cố gắng thiết lập một cách thông minh sys.path. Làm thế nào nó được thiết lập có thể trở nên thực sự phức tạp . Các hướng dẫn sau đây là một phần nào-không đầy đủ, dẫn hơi-sai, nhưng hy vọng-hữu ích tưới xuống cho hàng ngũ quân đội và file python lập trình viên về những gì sẽ xảy ra khi con số python ra những gì để sử dụng như là giá trị ban đầu của sys.path,
sys.executable, sys.exec_prefix, và sys.prefixtrên một
cài đặt python bình thường .
Đầu tiên, python làm hết sức mình để tìm ra vị trí thực tế của nó trên hệ thống tệp dựa trên những gì hệ điều hành nói với nó. Nếu hệ điều hành chỉ cho biết "python" đang chạy, nó sẽ tự tìm thấy nó trong $ PATH. Nó giải quyết bất kỳ liên kết tượng trưng nào. Khi nó đã thực hiện xong việc này, đường dẫn của tệp 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 các giá trị ban đầu cho sys.exec_prefixvà
sys.prefix.
Nếu có một tệp được gọi pyvenv.cfgtrong cùng một thư mục với
sys.executablehoặc một thư mục lên, python sẽ xem xét nó. Các hệ điều hành khác nhau làm những việc khác nhau với tệp này.
Một trong những 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 sys.prefixsau này. Nếu applocal = truecài đặt xuất hiện trong pyvenv.cfgtệp trên Windows, nhưng không xuất hiện trong
home = <DIRECTORY>cài đặt, thì cài đặt đó sys.prefixsẽ được đặt thành thư mục chứa sys.executable.
Tiếp theo, PYTHONHOMEbiến môi trường được kiểm tra. Trên Linux và Mac,
sys.prefixvà sys.exec_prefixđược đặt thành PYTHONHOMEbiến môi trường, nếu nó tồn tại, sẽ thay thế mọi home = <DIRECTORY>cài đặt trong pyvenv.cfg. Trên Windows,
sys.prefixvà sys.exec_prefixđược đặt thành PYTHONHOMEbiến môi trường, nếu nó tồn tại, trừ khi có một home = <DIRECTORY>cài đặt pyvenv.cfg, được sử dụng thay thế.
Nếu không, chúng sys.prefixvà sys.exec_prefixđược tìm thấy bằng cách đi ngược lại từ vị trí của sys.executable, hoặc homethư mục được cung cấp bởi pyvenv.cfgnếu có.
Nếu tệp 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ì thư mục đó được đặt thành
sys.exec_prefixtrên Linux hoặc Mac. Nếu tệp
lib/python<version>/os.pyđược tìm thấy trong thư mục hoặc bất kỳ thư mục con nào của nó, thì thư mục đó được đặt thành sys.prefixtrên Linux, Mac và Windows, sys.exec_prefixđược đặt thành giá trị giống như
sys.prefixtrên Windows. Toàn bộ bước này bị bỏ qua trên Windows nếu
applocal = trueđược đặt. Thư mục của sys.executableđượ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 nó không thể tìm thấy các tệp "mốc" này hoặc sys.prefixvẫn chưa được tìm thấy, thì python sẽ đặt sys.prefixthành giá trị "dự phòng". Ví dụ, Linux và Mac sử dụng các giá trị mặc định được biên dịch trước làm giá trị của sys.prefixvà sys.exec_prefix. Windows sẽ đợi cho đến khi sys.pathđược tìm hiểu đầy đủ để đặt giá trị dự phòng cho
sys.prefix.
Sau đó, (những gì bạn đã chờ đợi,) python xác định các giá trị ban đầu được chứa trong đó sys.path.
- Thư mục của tập lệnh mà python đang thực thi được thêm vào
sys.path. Trên Windows, đây luôn là chuỗi trống, lệnh này yêu cầu python sử dụng đường dẫn đầy đủ nơi tập lệnh được đặt thay thế.
- Nội dung của biến môi trường PYTHONPATH, nếu được đặt, sẽ được thêm vào
sys.path, trừ khi bạn đang sử dụng Windows và applocalđược đặt thành true trong pyvenv.cfg.
- Đường dẫn tệp zip,
<prefix>/lib/python35.ziptrên Linux / Mac và
os.path.join(os.dirname(sys.executable), "python.zip")Windows, được thêm vào sys.path.
- Nếu trên Windows và không
applocal = trueđược đặt trong pyvenv.cfg, thì nội dung của các khóa con của khóa đăng ký
HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\sẽ được thêm vào, nếu có.
- Nếu trên Windows và không có
applocal = trueđược thiết lập pyvenv.cfgvà sys.prefixkhông thể tìm thấy, thì nội dung cốt lõi của khóa đăng ký HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\sẽ được thêm vào, nếu nó tồn tại;
- Nếu trên Windows và không
applocal = trueđược đặt trong pyvenv.cfg, thì nội dung của các khóa con của khóa đăng ký
HK_LOCAL_MACHINE\Software\Python\PythonCore\<DLLVersion>\PythonPath\sẽ được thêm vào, nếu có.
- Nếu trên Windows và không có
applocal = trueđược thiết lập pyvenv.cfgvà sys.prefixkhông thể tìm thấy, thì nội dung cốt lõi của khóa đăng ký HK_CURRENT_USER\Software\Python\PythonCore\<DLLVersion>\PythonPath\sẽ được thêm vào, nếu nó tồn tại;
- Nếu trên Windows và PYTHONPATH không được đặt, không tìm thấy tiền tố và không có khóa đăng ký nào thì giá trị thời gian biên dịch tương đối của PYTHONPATH sẽ được thêm vào; nếu không, bước này bị bỏ qua.
- Các đường dẫn trong macro thời gian biên dịch PYTHONPATH được thêm vào liên quan đến được tìm thấy động
sys.prefix.
- 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 sys.prefixsẽ được thêm vào.
Ở giai đoạn này trên Windows, nếu không tìm thấy tiền tố nào, thì python sẽ cố gắng xác định nó bằng cách tìm kiếm tất cả các thư mục trong đó sys.pathcho các tệp mốc, như nó đã cố gắng thực hiện với thư mục sys.executabletrước đó, cho đến khi tìm thấy thứ gì đó. Nếu không, sys.prefixđược để trống.
Cuối cùng, sau tất cả những điều này, Python tải sitemô-đun, mô-đun này bổ sung thêm nhiều thứ cho sys.path:
Nó bắt đầu bằng cách xây dựng tối đa bốn thư mục từ phần đầu và phần đuôi. Đối với phần đầu, nó sử dụng sys.prefixvà sys.exec_prefix; đầu trống được bỏ qua. Đối với phần đuôi, nó sử dụng chuỗi trố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 head-tail riêng biệt, nó sẽ xem liệu nó có tham chiếu đến một thư mục hiện có hay không và nếu có, thêm nó vào sys.path và cũng kiểm tra đường dẫn mới được thêm vào cho các tệp cấu hình.