2011-07-08 32 views
131

Tôi đã tạo thư mục và khởi tạo một cá thể virtualenv trong đó.Đổi tên thư mục virtualenv mà không vi phạm nó

$ mkdir myproject 
$ cd myproject 
$ virtualenv env 

Khi tôi chạy (env)$ pip freeze, nó sẽ hiển thị các gói đã cài đặt.

Bây giờ tôi muốn đổi tên myproject/ thành project/.

$ mv myproject/ project/ 

Tuy nhiên, bây giờ khi tôi chạy

$ . env/bin/activate 
(env)$ pip freeze 

nó nói pip không được cài đặt. Làm cách nào để đổi tên thư mục dự án mà không vi phạm môi trường?

+1

Câu hỏi này là cũ và đã có một câu trả lời, nhưng tôi phải tự hỏi, tại sao không thể OP chỉ di chuyển virtualenv trở lại nơi nó được? Rõ ràng là không giải quyết được mong muốn di chuyển/đổi tên, nhưng điều đó sẽ không khôi phục được virtualenv đang hoạt động, hay nó đã bị phá vỡ một cách vô vọng? –

+1

Có, bạn nói đúng, nó sẽ sửa chữa virtual env, nhưng không giải quyết được vấn đề. – Florian

Trả lời

127

Bạn cần điều chỉnh cài đặt của mình để sử dụng đường dẫn tương đối. virtualenv cung cấp tùy chọn này với tùy chọn --relocatable. Từ the docs:

Môi trường thông thường được gắn với đường dẫn cụ thể . Điều đó có nghĩa là bạn không thể di chuyển môi trường xung quanh hoặc sao chép nó sang một máy tính khác. Bạn có thể sửa chữa lập một môi trường để làm cho nó relocatable bằng lệnh:

$ virtualenv --relocatable ENV

LƯU Ý: ENV là tên của môi trường ảo và bạn phải chạy này từ bên ngoài Thư mục ENV.

Điều này sẽ làm cho một số các tập tin được tạo ra bởi setuptools hoặc phân phối sử dụng đường dẫn tương đối, và sẽ thay đổi tất cả các kịch bản để sử dụng activate_this.py thay vì sử dụng các vị trí của trình thông dịch Python để chọn môi trường .

Lưu ý: bạn phải chạy sau khi bạn đã cài đặt bất kỳ gói nào vào môi trường . Nếu bạn thực hiện một môi trường có thể định vị lại, sau đó cài đặt gói mới, bạn phải chạy virtualenv - có thể tiếp tục lại.

+1

Làm việc như một say mê, cảm ơn. –

+2

caveat: Thay đổi một env để relocatable làm nhiều hơn là chỉ cho phép bạn di chuyển thư mục. (xem * Ghi chú: * sao chép từ tài liệu) ... nó có thể có phản ứng phụ. –

+5

Tùy chọn - có thể liên quan hiện có một số vấn đề và không được đảm bảo hoạt động trong mọi trường hợp. Có thể tùy chọn sẽ không được chấp nhận trong phiên bản tương lai của virtualenv. Ngoài ra, điều này không làm cho các gói của bạn đa nền tảng. Bạn có thể di chuyển thư mục xung quanh, nhưng nó chỉ có thể được sử dụng trên các máy tính tương tự khác. –

79

Điều tôi tin là "knowing why" matters more than "knowing how". Vì vậy, đây là một cách tiếp cận khác để sửa lỗi này.

Khi bạn chạy:

$ . env/bin/activate

nó thực sự thực hiện các lệnh sau:

(tôi thử nghiệm này trong /tmp)

VIRTUAL_ENV="/tmp/myproject/env" 
export VIRTUAL_ENV 

Tuy nhiên, bạn vừa đổi tên myproject để project, do đó lệnh đó không thực hiện được. Đó là lý do tại sao nó nói pip is not installed, bởi vì không phải bạn đã cài đặt pip trong môi trường toàn cầu của hệ thống cũng như virtualenv pip của bạn được cung cấp chính xác.

Nếu bạn muốn khắc phục điều này bằng tay, có nghĩa là con đường:

  1. sửa đổi /tmp/project/env/bin/activate với biên tập viên ưa thích với yout như Vim, thường ở Line 42

    VIRTUAL_ENV='/tmp/myproject/env' =>VIRTUAL_ENV='/tmp/project/env'

  2. sửa đổi /tmp/project/env/bin/pip trong Line 1

    #!/tmp/myproject/env/bin/python =>#!/tmp/project/env/bin/python

Sau đó, kích hoạt môi trường ảo của bạn env một lần nữa, và bạn sẽ thấy bạn pip đã trở lại một lần nữa.

+0

hoạt động tuyệt vời cho tôi, cảm ơn bạn! – Michael

+3

Nếu muốn thay đổi đường dẫn theo cách thủ công, thì cần lưu ý rằng có nhiều hơn hai tệp được mã hóa cứng. Tìm tất cả chúng với một cái gì đó như: 'grep -iHnR venv-name/path/to/venv-name | grep -v "^ Tập tin nhị phân" | grep -i venv-name'. Trong thực tế, tôi nhận thấy rằng trong một trong những trường hợp Django của tôi, rất nhiều các gói có "đường dẫn đến Python sh-bang" trong đó. – Kevin

+0

Điều này đã giúp tôi rất nhiều. Tôi chắc chắn cần phải biết tại sao ... Cảm ơn! – Jarvis

28

LƯU Ý: Là @jb. chỉ ra, giải pháp này chỉ áp dụng cho một cách dễ dàng (tái) được tạo ra virtualenv s. Nếu một môi trường mất vài giờ để cài đặt giải pháp này không được khuyến nghị


Virtualenv là tuyệt vời vì chúng dễ tạo và chuyển đổi xung quanh; họ giữ cho bạn khỏi bị khóa vào một cấu hình duy nhất. Nếu bạn biết các yêu cầu của dự án, hoặc có thể nhận được chúng, Thực hiện một mới virtualenv:

  • Tạo một file

    (env)$ pip freeze > requirements.txt

    • requirements.txt Nếu bạn không thể tạo ra các tập tin requirements.txt , hãy kiểm tra env/lib/pythonX.X/site-packages trước khi xóa bản gốc env.
  • Xóa hiện (env)

    deactivate && rm -rf env

  • Tạo mới virtualenv, kích hoạt nó, và cài đặt yêu cầu

    virtualenv env && . env/bin/activate && pip install -r requirements.txt


Ngoài ra, sử dụng virtualenvwrapper để làm cho mọi việc một chút dễ dàng hơn như tất cả virtualenvs được lưu giữ tại một địa điểm tập trung

$(old-venv) pip freeze > temp-reqs.txt 
$(old-venv) deactivate 
$ mkvirtualenv new-venv 
$(new-venv) pip install -r temp-reqs.txt 
$(new-venv) rmvirtualenv old-venv 
+4

Đối với một số người, 'pip install -r requirements.txt' mất vài giờ (biên dịch phần mở rộng C của bên thứ ba trên mâm xôi pi). –

+2

Có lẽ đúng, nhưng điều đó có vẻ giống như một trường hợp cạnh tranh với tôi. Tôi vẫn nghĩ rằng đây có thể là một giải pháp khả thi cho nhiều trường hợp. – bnjmn

+0

Yah, nhiều dự án (ví dụ trang web Django) chỉ mất 30 giây để cài đặt mọi thứ, ngay cả khi họ có vài chục phụ thuộc (miễn là bạn tải xuống mọi thứ trước và sử dụng '--no-index --find-links = downloadDir ') –

11

Bạn có thể khắc phục sự cố bằng cách làm theo các bước sau:

  1. đổi tên thư mục của bạn
  2. chạy lại thao tác này: $ virtualenv ..\path\renamed_directory
  3. virtualenv sẽ sửa các liên kết thư mục trong khi vẫn để các gói của bạn ở vị trí
  4. $ scripts/activate
  5. $ pip freeze để xác minh các gói của bạn được đưa ra
  6. Một caveat quan trọng, nếu bạn có bất kỳ phụ thuộc con đường tĩnh trong các tập tin script trong thư mục virtualenv của bạn, bạn sẽ phải tự thay đổi những.
+0

Đây là một giải pháp rất tốt cho tôi. Vì giải pháp này _may_ tránh một số vấn đề liên quan đến '--relocatable', tôi nghĩ giải pháp này tốt hơn câu trả lời được chấp nhận. Cho đến nay, tôi đã nhận thấy rằng nhiều tệp '.pyc' trong' _new_name_/lib/python2.7' vẫn tham chiếu đến '_old_name_'. Tuy nhiên, điều đó dường như không ảnh hưởng đến môi trường của tôi hoạt động như thế nào. Có lẽ giải pháp duy nhất tốt hơn là sử dụng 'virtualenvwrapper' hoặc một số tiện ích khác được đề cập trong số các câu trả lời ở đây. Ít nhất giải pháp này không yêu cầu cài đặt các chương trình bổ sung. –

+0

Hoạt động như một sự quyến rũ! – TechJS

1

virtualenv --relocatable ENV không phải là giải pháp mong muốn. Tôi cho rằng hầu hết mọi người đều muốn có khả năng đổi tên một virtualenv mà không cần bất kỳ tác dụng phụ lâu dài nào.

Vì vậy, tôi đã tạo một công cụ đơn giản để thực hiện điều đó. Trang dự án cho virtualenv-mv phác thảo chi tiết hơn một chút, nhưng về cơ bản bạn có thể sử dụng virtualenv-mv giống như bạn sử dụng triển khai đơn giản mv (không có bất kỳ tùy chọn nào).

Ví dụ:

virtualenv-mv myproject project 

Xin lưu ý tuy nhiên tôi chỉ hack này lên. Nó có thể phá vỡ trong các trường hợp bất thường (ví dụ: virtualenvs liên kết) vì vậy hãy cẩn thận (sao lưu những gì bạn không thể đủ khả năng để mất) và cho tôi biết nếu bạn gặp bất kỳ vấn đề nào.

23

Tôi luôn cài đặt virtualenvwrapper để trợ giúp. Từ dấu nhắc shell:

pip install virtualenvwrapper 

Có một cách ghi nhận trong các tài liệu virtualenvwrapper - cpvirtualenv Đây là những gì bạn làm. Hãy chắc chắn rằng bạn đã ra khỏi môi trường của bạn và trở lại dấu nhắc trình bao.Gõ vào đây với tên yêu cầu:

cpvirtualenv oldenv newenv 

Và sau đó, nếu cần thiết:

rmvirtualenv oldenv 

Để đi đến newenv của bạn:

workon newenv 
+0

Câu trả lời của Afrowave thực sự phải là phương pháp được chấp nhận. – Jaxian

+0

Điều này chỉ hoạt động nếu một người đang sử dụng 'virtualenvwrapper', không chỉ' virtualenv'. [Câu trả lời này] (http://stackoverflow.com/a/29482481/543738) từ @ryankdwyer là tốt hơn. –

+0

Tôi đã chỉnh sửa câu trả lời của mình để phản ánh câu trả lời nên cài đặt 'virtualenvwrapper'. Giả sử rằng các môi trường ảo đổi tên xảy ra rất nhiều, tôi sẽ giới thiệu theo cách này. – Afrowave

8

Tuy nhiên, một cách khác để làm điều đó mà làm việc cho tôi nhiều lần mà không gặp sự cố là virtualenv-clone:

pip install virtualenv-clone 
virtualenv-clone old-dir/env new-dir/env 
+0

Câu trả lời hay nhất !!! –

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