2011-08-22 36 views
17

Tôi tiếp tục tìm kiếm câu trả lời nhưng không tìm thấy câu trả lời. Tôi có một thư mục env ảo, một thư mục dự án có req.txt. Khi tôi chạy pip -r req.txt, nó cài đặt một số ứng dụng từ github (nguồn) và một số từ pypi. Những cái từ pypi là tốt sau khi cuộc gọi relocatable trên evn ảo, tuy nhiên các liên kết trong các gói trang web cho các ứng dụng mà nó được cài đặt từ github vẫn trỏ đến vị trí thư mục cũ.virtualenv relocatable - nó thực sự hoạt động

Bất kỳ ai khác đã thấy hành vi này? Bất kỳ cách nào nhanh chóng xung quanh nó? Ngoài ra, relocatable không tôn vinh cờ --no-site-packages đã được sử dụng trên virtualenv ban đầu. Khi bạn di chuyển ảo và kích hoạt lại nó, mọi thứ có thể nhìn thấy từ các gói trang web của hệ thống. Tài liệu cho thấy hành vi này là một thực tế, vì vậy tôi tự hỏi nếu có bất kỳ cách nhanh chóng xung quanh điều này?

+0

"Cuộc gọi có thể định vị lại trên virtual env" là gì? – hughdbrown

+0

Hãy nhớ chấp nhận câu trả lời cho câu hỏi của bạn. Bạn làm điều này bằng cách nhấp vào dấu kiểm bên cạnh dấu kiểm hữu ích nhất. Xin vui lòng quay trở lại và làm điều đó cho cũ của bạn, câu hỏi trả lời quá. – agf

+0

Tôi không hiểu tại sao bạn muốn di chuyển virtualenv của bạn xung quanh. Tôi chỉ có chúng trong '~/.virtualenvs' và tôi đã làm xong với nó. Không ồn ào, không ồn ào. – hughdbrown

Trả lời

12

Như đã nêu trong the documentation--relocatable là một tùy chọn thử nghiệm, do đó, không có gì đáng ngạc nhiên khi bạn gặp khó khăn với nó. Điều đó nói rằng, bạn có nhớ chạy lại --relocatable sau khi cài đặt các gói mới không? Nếu bạn đã cài đặt các gói từ github với -e, đó có thể là một vấn đề, vì nó không cài đặt vào các gói trang web, mà là các liên kết vào nó. Để thay thế cho việc sử dụng --relocatable, bạn thường có thể xóa các tệp riêng ảovà tạo lại tệp đó tại chỗ (mà tôi đã thực hiện một vài lần khi chuyển đổi giữa các nền tảng).

+0

Ngoài ra, tôi đã sử dụng '--relocatable' và thấy nó tốt. Tất nhiên, bạn cần phải chạy nó ngay trước khi di chuyển để đảm bảo rằng không có gì là bỏ qua, như bạn nói. – Marcin

10

Không, đối với một '- có thể liên quan' không cập nhật tập lệnh 'virtualenv/bin/activate'. Có, bạn có thể khắc phục điều đó bằng cách chạy lại thiết lập ảo env như zeekay được đề xuất, tuy nhiên ảnh tĩnh không nhập bất kỳ cài đặt 'pip -e git ...' nào được đặt trong 'virtualenv/src', do đó bạn sẽ phải chạy lại những pip cài đặt bằng tay.

Từ kinh nghiệm bây giờ một ngày tôi không cài đặt với pip có thể chỉnh sửa (-e) và nếu cần sao chép thủ công kho vào 'project/src /' thay vì 'project/virtualenv/src' và có đoạn mã dưới đây auto_prep_pythonpath.py được tải trước khi khởi chạy dự án của tôi (tôi tham chiếu nó trong kịch bản django.wsgi của tôi).

Như một lưu ý phụ, tôi nối 'phù hợp' với bất kỳ gói nào được đặt trong 'project/src' được sửa đổi/tấn công nên tôi không phải lo lắng về tính tương thích ngược và theo dõi tất cả các nguồn dưới sự kiểm soát mã kho trực tuyến có thể và sẽ phanh trên bạn.

Hy vọng điều này sẽ hữu ích.

""" 
Prepares python path to include additional project/src/<APP> in PYTHONPATH - This file gets automatically loaded by projects __init__.py 

This script lives in 'project/src/django-project/auto_prep_pythonpath.py', modify 
'SOURCE_ROOT' if you place it somehwere else. 
""" 
import logging 
import os 
import sys 
SOURCE_ROOT = os.path.dirname(os.path.abspath(__file__)).replace('\\','/') # the replacements are when on windows 
SOURCE_ROOT = os.path.join(SOURCE_ROOT, '../').replace('\\','/') 
SOURCE_ROOT = os.path.normpath(SOURCE_ROOT) 

logger = logging.getLogger(__name__) 

logger.info("Adding packages in 'src/*' required by project to PYTHONPATCH.") 
dirlist_arr = os.listdir(SOURCE_ROOT) 
while dirlist_arr: 
    item_path = os.path.join(SOURCE_ROOT, dirlist_arr.pop()).replace('\\','/') # replace dashes is for win based file system 
    if os.path.isdir(item_path): 
     if not item_path in sys.path: 
      sys.path.insert(0, item_path) # we use insert to take precedence over any global paths - minimises import conflict suprises 
     logger.debug("Path '%s' added." % item_path) 
Các vấn đề liên quan