Câu hỏi Tại sao sử dụng sys.path.append (đường dẫn) thay vì sys.path.insert (1, đường dẫn)?


Chỉnh sửa: dựa trên nhận xét của Ulf Rompe, điều quan trọng là bạn sử dụng "1" thay vì "0", nếu không bạn sẽ phá vỡ sys.path.

Tôi đã làm python khá lâu rồi (hơn một năm), và tôi luôn nhầm lẫn là tại sao mọi người khuyên bạn sử dụng sys.path.append() thay vì sys.path.insert(). Hãy để tôi chứng minh.

Hãy nói rằng tôi đang làm việc trên một mô-đun có tên PyWorkbooks (được cài đặt trên máy tính của tôi), nhưng tôi đồng thời làm việc trên một mô-đun khác (giả sử PyJob) kết hợp PyWorkbooks. Khi tôi đang làm việc trên PyJob tôi tìm thấy lỗi trong PyWorkbooks mà tôi đang sửa, vì vậy tôi muốn nhập một phiên bản phát triển.

Có nhiều cách để làm việc trên cả hai (tôi có thể đặt dự án PyWorkbooks của tôi bên trong PyJob, ví dụ), nhưng đôi khi tôi vẫn sẽ cần phải chơi với đường dẫn. Tuy nhiên, Tôi không thể làm đơn giản sys.path.append() vào thư mục PyWorkbooks đang ở. Tại sao? Bởi vì python sẽ tìm thấy PyWorkbooks đã cài đặt của tôi trước tiên!

Đây là lý do tại sao bạn phải làm một sys.path.insert (1, path_to_dev_pyworkbooks)

Tóm tắt:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

hoặc là:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

Điều này đã gây ra một vài sự cố cho tôi trong quá khứ và tôi thực sự thích nó nếu chúng tôi (như một cộng đồng) bắt đầu đề xuất sys.path.insert(1, path), như thể bạn đang chèn một đường dẫn theo cách thủ công, tôi nghĩ có thể nói rằng đó là đường dẫn bạn muốn sử dụng!

Hay tôi có điều gì sai? Đó là một câu hỏi mà đôi khi làm phiền tôi và tôi muốn nó trong mở!


76
2018-04-10 19:19


gốc


Tôi đã thực hiện sys.path.insert(1, dev_folder) nhưng nó vẫn không tìm thấy module dev, và chỉ sử dụng module đã cài đặt. Làm thế nào để sửa lỗi này? - endolith


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


Nếu bạn có nhiều phiên bản của gói / mô-đun, bạn cần phải sử dụng virtualenv (tôi nhấn mạnh):

virtualenv là một công cụ để tạo ra môi trường Python bị cô lập.

Vấn đề cơ bản đang được giải quyết là một trong các phụ thuộc và các phiên bản, và các điều khoản gián tiếp. Hãy tưởng tượng bạn có một ứng dụng cần phiên bản 1 của LibFoo, nhưng một ứng dụng khác yêu cầu phiên bản 2. Bạn có thể sử dụng cả hai ứng dụng này như thế nào? Nếu bạn cài đặt mọi thứ vào /usr/lib/python2.7/site-packages (hoặc bất kỳ vị trí chuẩn nào của nền tảng của bạn), thật dễ dàng để kết thúc trong một tình huống mà bạn vô tình nâng cấp một ứng dụng không nên được nâng cấp.

Hoặc nói chung, nếu bạn muốn cài đặt một ứng dụng và Kệ nó? Nếu một ứng dụng hoạt động, bất kỳ thay đổi nào trong các thư viện của nó hoặc các phiên bản của các thư viện đó có thể phá vỡ ứng dụng.

Ngoài ra, nếu bạn không thể cài đặt gói vào toàn cầu site-packages danh mục? Ví dụ, trên một máy chủ chia sẻ.

Trong tất cả các trường hợp này, virtualenv có thể giúp bạn. Nó tạo ra một môi trường có các thư mục cài đặt riêng, không chia sẻ các thư viện với các môi trường ảo hóa khác (và tùy chọn không truy cập các thư viện được cài đặt trên toàn cầu).

Đó là lý do tại sao mọi người xem xét insert(0, là sai - đó là giải pháp không hoàn chỉnh, giải pháp tạm thời cho vấn đề quản lý nhiều môi trường.


42
2018-04-10 19:23



Cảm ơn, tôi mơ hồ biết một cái gì đó như thế này tồn tại nhưng tôi đã không thực sự kiểm tra nó ra cho đến bây giờ. Vì vậy, những gì tôi sẽ phải làm với điều này là chạy tất cả mọi thứ từ các thông dịch viên trong môi trường ảo ... mà có thể làm việc là tốt. Cảm ơn! - Garrett Berg


Nếu bạn thực sự cần sử dụng sys.path.insert, hãy xem xét rời khỏi sys.path [0] vì nó là:

sys.path.insert(1, path_to_dev_pyworkbooks)

Điều này có thể quan trọng vì mã của bên thứ 3 có thể dựa vào tài liệu sys.path sự phù hợp:

Khi được khởi tạo khi khởi động chương trình, mục đầu tiên của danh sách này,   path [0], là thư mục chứa tập lệnh được sử dụng để   gọi trình thông dịch Python.


40
2018-04-10 22:47





bạn đang bối rối khái niệm phụ thêm và thêm vào. đoạn mã sau được thêm vào:

sys.path.insert(1,'/thePathToYourFolder/')

nó đặt thông tin mới ngay từ đầu (tốt, thứ hai, chính xác) của chuỗi tìm kiếm mà thông dịch viên của bạn sẽ trải qua. sys.path.append() đặt mọi thứ vào cuối chuỗi tìm kiếm.

bạn nên sử dụng một cái gì đó như virtualenv thay vì tự mã hóa các thư mục gói của bạn vào PYTHONPATH mỗi lần. để thiết lập các hệ sinh thái khác nhau tách các gói trang web của bạn và các phiên bản python có thể có, hãy đọc hai blog sau:

  1. giới thiệu hệ sinh thái python

  2. bootstrapping python virtual environment

nếu bạn quyết định di chuyển xuống đường dẫn đến cách ly môi trường, bạn chắc chắn sẽ có lợi khi nhìn vào virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/


12
2018-06-24 18:01