Làm cách nào để thêm đường dẫn đến PYTHONPATH trong virtualenv


97

Tôi đang cố gắng thêm một đường dẫn vào biến môi trường PYTHONPATH, biến đó sẽ chỉ hiển thị từ một môi trường virtualenv cụ thể.

Tôi đã thử SET PYTHONPATH=...dưới dấu nhắc lệnh virtualenv, nhưng điều đó đặt biến cho toàn bộ môi trường.

Làm cách nào để đạt được điều đó?

Câu trả lời:


155

Bạn thường có thể tránh được việc phải làm bất cứ điều gì với PYTHONPATH bởi sử dụng .pthcác file . Chỉ cần đặt một tệp có phần mở rộng .pth (bất kỳ tên cơ sở nào hoạt động) trong thư mục gói trang web của virtualenv, ví dụ: lib\python2.7\site-packagesvới đường dẫn tuyệt đối đến thư mục chứa gói của bạn làm nội dung duy nhất của nó.


Rất tiếc, điều này không hoạt động như một ghi đè. Nó nối thêm đường dẫn, vì vậy nếu bạn đang phát triển nó sẽ không hoạt động.
Erik Aronesty

Ngoài ra, nếu bạn biết đường dẫn tuyệt đối, điểm của một biến là gì?
Jamie Marshall

bạn cũng có thể điều hướng đến thư mục gói trang của môi trường ảo và tạo một liên kết tượng trưng đến tệp .pth như sau: ln -s path / to / somfile.pth. Tôi thấy điều này hữu ích khi tôi cần cùng một thư mục để có thể truy cập được trong nhiều môi trường ảo
Data-phile

91

Nếu bạn đang sử dụng virtualenv, có lẽ bạn cũng nên sử dụng virtualenvwrapper , trong trường hợp đó, bạn có thể sử dụng lệnh add2virtualenv để thêm đường dẫn vào đường dẫn Python cho virtualenv hiện tại:

add2virtualenv directory1 directory2 …


3
Làm thế nào về việc xóa khỏi virtualenv?
silverdagger

1
Tôi muốn thêm một nhận xét thân thiện rằng trên các máy chủ được chia sẻ và các tình huống tương tự không mong muốn trình bao bọc venv. Trong những trường hợp như vậy, một venv có hiệu lực và tất cả những gì cần thiết để cài đặt bổ sung không được mong muốn. Tại địa phương mọi thứ khác nhau, nhưng trên máy chủ / hình ảnh KISS thực sự quan trọng.
Marc

2
Tôi không chắc lệnh hoạt động như thế nào khi điều này được viết, nhưng add2virtualenvkhông sửa đổi $ PYTHONPATH, thay vào đó nó sửa đổi sys.path.
ForeverWintr

1
@ajostergaard: Xin lỗi, tôi nên cung cấp một nguồn. Nếu bạn nhìn vào mã nguồn add2virtualenv, bạn có thể thấy nó đang sửa đổi sys.path. Tôi đồng ý rằng tài liệu làm cho nó giống như nó sửa đổi PYTHONPATHbiến môi trường, nhưng điều đó dường như không chính xác. bitbucket.org/virtualenvwrapper/virtualenvwrapper/src/…
ForeverWintr

1
@ForeverWintr Tôi đã sửa - các tệp .pth được sử dụng để thiết lập sys.path. docs.python.org/2/library/site.html Nhầm lẫn.com !
ostergaard

5

Bạn cũng có thể thử đặt liên kết biểu tượng vào một trong các virtualenv của mình.

ví dụ. 1) kích hoạt virtualenv của bạn 2) chạy python 3) nhập sys và kiểm tra sys.path 4) bạn sẽ tìm thấy đường dẫn tìm kiếm python ở đó. Chọn một trong những cái đó (ví dụ: site-package) 5) vào đó và tạo liên kết tượng trưng cho gói của bạn như: ln -s path-to-your-package name-with-which-will-be-import

Bằng cách đó, bạn có thể nhập nó ngay cả khi không kích hoạt virtualenv của mình. Chỉ cần thử: path-to-your-virtualenv-folder / bin / python và nhập gói của bạn.


Tôi đoán điều này đã bị phản đối vì sử dụng liên kết tượng trưng thay vì tệp .pth. Nó làm việc cho tôi mặc dù vậy, whavever.
Gareth Davidson

3

Nếu bạn đang sử dụng virtualenvwrapper,

$ cd to the parent folder
$ add2virtualenv  folder_to_add

bảng điều khiển sẽ hiển thị

Warning: Converting "folder_to_add" to "/absoutle/path/to/folder_to_add"

Vậy là xong, và bạn nên đi


1
import sys
import os

print(str(sys.path))

dir_path = os.path.dirname(os.path.realpath(__file__))
print("current working dir: %s" % dir_path)

sys.path.insert(0, dir_path)

Tôi thực sự khuyên bạn nên sử dụng virtualenv và virtualenvwrapper để tránh làm lộn xộn đường dẫn.


nếu bạn muốn điều này để làm việc với bất kỳ phiên bản python, chỉ cần sử dụng một kiểu cũ chuỗi định dạng bình thường chứ không phải là ưa thích e-chuỗi f "... {dir_path}"
Guillaume S

Cảm ơn đã nhận xét. Tôi đã sửa lại để sử dụng. những cách cũ là cồng kềnh và mang phong cách riêng và không có gì là lạ mắt về một hệ thống khuôn mẫu đơn giản
Cao su Duck

Mọi thứ đều tương đối :)
Guillaume S
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.