2014-04-28 16 views
6

Tôi sử dụng Jedi để tự động hoàn thành bằng Python trong Emacs, nhưng nó không phụ thuộc vào mã của tôi vì vậy tôi không muốn đặt nó trong số requirements.txt. (Nhà phát triển khác có thể không sử dụng một plugin biên tập Jedi, và nó chắc chắn không cần thiết khi tôi triển khai đến Heroku.)Virtualenv có thể được thực hiện để quay trở lại gói người dùng thay vì gói hệ thống không?

Nhưng Jedi phải có sẵn từ virtualenv tôi để chức năng, tức là nếu tôi không thể

import jedi 

nó không hoạt động.

Có cách nào tốt để cài đặt Jedi người dùng trên toàn cầu sao cho nó có sẵn trong tất cả các virtualenv của tôi không?

tôi nghĩ những gì tôi muốn là để

  1. cài đặt Jedi vào ~/.local/lib/python2.7/site-packages/ với pip's --user flag, sau đó đến
  2. tạo virtualenv của tôi bằng cách sử dụng tương đương với the --system-site-packages flag, nhưng đối với gói dùng thay vì gói hệ thống .

Cách giải quyết hiện tại của tôi là pip install jedi trong mỗi virtualenv của tôi. Sau đó, khi tôi thêm các phụ thuộc mới, tôi pip install foo, pip freeze > requirements.txt, sau đó xóa thủ công jedi và một vài thứ khác từ tệp trước khi cam kết. Rõ ràng, đây là thời gian và dễ bị lỗi.

Có ai có giải pháp tốt hơn không?

+0

Tại sao bạn không cài đặt trong gói trang web toàn cầu? Nó cũng sẽ giúp để biết được plugin Jedi cho Emacs bạn đang sử dụng. –

+0

@DaveHalter, tôi đang sử dụng ['emacs-jedi'] (https://github.com/tkf/emacs-jedi) bị tấn công [qua MELPA] (https://github.com/milkypostman/melpa/blob/ master/recipes/jedi). Tôi không cài đặt Jedi trên toàn cầu và rơi trở lại đó bởi vì tôi không muốn virtualenvs của tôi nhìn thấy bất kỳ của rất nhiều các gói khác trên toàn cầu mà tôi đã cài đặt ... Nếu họ là khép kín tôi có thể tự tin hơn rằng tôi có tất cả các phụ thuộc của tôi được liệt kê trong 'requirements.txt'. – Chris

Trả lời

4

Khi virtuenvactivate s, nó thay đổi một số biến env, chẳng hạn như PATH, PYTHONHOME, PS1, và như vậy, chỉ mong muốn nhị phân python, thư viện, vv Bạn có thể thay đổi kịch bản để thay đổi PYTHONPATH sử dụng trang web sử dụng của bạn -packages, cụ thể là ~/.local/lib/python2.7/site-packages và có thể là các gói trang web hệ thống của bạn. Với thiết lập này, pip sẽ tìm kiếm thư viện trong virtual env, và sau đó chuyển đổi dự phòng thành user-system-package. Lưu ý rằng tập lệnh kích hoạt thông thường không thay đổi PYTHONPATH.

Tức là, thêm các dòng sau vào virtual_env/bin/activate của bạn.

# in activate script 

    # in deactivate function 
    if [ -n "$_OLD_VIRTUAL_PYTHONPATH" ] ; then 
     PYTHONPATH="$_OLD_VIRTUAL_PYTHONPATH" 
     export PYTHONPATH 
     unset _OLD_VIRTUAL_PYTHONPATH 
    fi 

# in activate section 
if [ -n "$PYTHONPATH" ] ; then 
    _OLD_VIRTUAL_PYTHONPATH="$PYTHONPATH" 
    PYTHONPATH=$HOME/.local/lib/python2.7/site-packages:/usr/lib/python2.7/site-packages 
fi 
+0

Nếu thay đổi được đề xuất của bạn bền, tôi có thể đề xuất bạn thực hiện thay đổi này trong mã nguồn không? https://github.com/pypa/virtualenv/blob/master/virtualenv_embedded/activate.sh Nó không có giá trị đối với chúng tôi, rằng tại thời điểm chạy dự án, chúng tôi luôn chạy venv trước khi chúng tôi kích hoạt, đặt lại những tập lệnh đó. – macetw

Các vấn đề liên quan