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.prefix
trê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_prefix
và
sys.prefix
.
Nếu có một tệp được gọi pyvenv.cfg
trong cùng một thư mục với
sys.executable
hoặ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.prefix
sau này. Nếu applocal = true
cài đặt xuất hiện trong pyvenv.cfg
tệp trên Windows, nhưng không xuất hiện trong
home = <DIRECTORY>
cài đặt, thì cài đặt đó 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ó tồn tại, sẽ thay thế mọi home = <DIRECTORY>
cài đặt 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 có một home = <DIRECTORY>
cài đặt pyvenv.cfg
, được sử dụng thay thế.
Nếu không, chúng sys.prefix
và 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 home
thư mục được cung cấp bởi pyvenv.cfg
nế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_prefix
trê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.prefix
trên Linux, Mac và Windows, sys.exec_prefix
được đặt thành giá trị giống như
sys.prefix
trê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.prefix
vẫn chưa được tìm thấy, thì python sẽ đặt sys.prefix
thà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.prefix
và 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.zip
trê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.cfg
và sys.prefix
khô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.cfg
và sys.prefix
khô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.prefix
sẽ đượ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.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 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 site
mô-đ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.prefix
và 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.