Cách nhân đôi virtualenv


130

Tôi có một virtualenv hiện có với rất nhiều gói nhưng một phiên bản cũ của Django.

Những gì tôi muốn làm là nhân đôi môi trường này để tôi có một môi trường khác với các gói chính xác tương tự nhưng một phiên bản mới hơn của Django. Tôi có thể làm cái này như thế nào?


3
Tôi sẽ đóng băng tất cả các yêu cầu của bạn vào tệp 'tests.txt' và tạo một virtualenv khác và chạy pip install tests.txt
Calvin Cheng

Nếu phiên bản python của môi trường ảo mà bạn muốn sao chép khác với môi trường python mặc định của bạn, bạn có thể thiết lập môi trường mới virtualenv -p /path/to/older/venv/bin/python new_venvvà sau đó sử dụng môi trường requirements.txtmà bạn đã tạo saupip freeze
GiriB

Câu trả lời:


183

Cách dễ nhất là sử dụng pip để tạo tệp yêu cầu. Một tệp yêu cầu về cơ bản là một tệp chứa danh sách tất cả các gói python bạn muốn cài đặt (hoặc đã được cài đặt trong trường hợp tệp được tạo bởi pip) và phiên bản chúng đang ở.

Để tạo tệp yêu cầu, hãy truy cập virtualenv ban đầu của bạn và chạy:

pip freeze > requirements.txt

Điều này sẽ tạo ra requirements.txt tập tin cho bạn. Nếu bạn mở tệp đó trong trình soạn thảo văn bản yêu thích của mình, bạn sẽ thấy một cái gì đó như:

Django==1.3
Fabric==1.0.1
etc...

Bây giờ, hãy chỉnh sửa dòng Django==x.xnói Django==1.3(hoặc bất kỳ phiên bản nào bạn muốn cài đặt trong virtualenv mới của bạn).

Cuối cùng, kích hoạt virtualenv mới của bạn và chạy:

pip install -r requirements.txt

Và pip sẽ tự động tải xuống và cài đặt tất cả các mô-đun python được liệt kê trong tệp yêu cầu của bạn , ở bất kỳ phiên bản nào bạn đã chỉ định!


3
Cảm ơn bạn! Trong khi googling tôi đã tìm thấy rất nhiều trang ồn ào, lộn xộn và khó hiểu ... Giải pháp của bạn rất sạch sẽ và đơn giản ... nó làm cho ngày của tôi;)
dolma33

Nếu tôi sao chép thư mục và sau đó dán nó vào máy khác thì sao? Nó sẽ làm việc? Tất nhiên, giả sử các phụ thuộc apt-get đã được giải quyết
Tales Pádua

Quả thực là không, như tôi đang tìm hiểu.
horcle_buzz

Tôi thấy nhiều tin nhắn Could not find a version that satisfies the requirement a_package=#.#.#Tôi có thể giải quyết dễ dàng không? Tôi đã xóa một dòng hoặc thay đổi đẳng thức thành bất đẳng thức.
Thay đổi thế giới

Làm việc cho pyenvlà tốt. Câu trả lời tuyệt vời.
Leonard

29

Một tùy chọn khác là sử dụng virtualenv-clonegói:

Một kịch bản để nhân bản một virtualenv không thể di chuyển.


Xin chào, tôi có đúng không khi cho rằng điều này cho phép tôi sao chép môi trường trăn WHOLE vào một tệp. Sau đó, tôi sẽ phải tải tệp này trong một máy tính / HĐH mới và tôi sẽ nhận được tất cả các gói trang web của mình được cài đặt lại
aceminer

2
"Virtualenv-clone source / target /" hoạt động như một lời cảm ơn!
ajankuv

đảm bảo chúng tôi đã cài đặt virtualenv-clonesau khi kích hoạt virtualenv
4givN

15

virtualenvwrappercung cấp một lệnh để nhân đôi virtualenv

cpvirtualenv ENVNAME [TARGETENVNAME]

7
Không thực sự là một ý tưởng tốt. "Sao chép môi trường ảo không được hỗ trợ tốt. Mỗi virtualenv có thông tin đường dẫn được mã hóa cứng vào đó và có thể có trường hợp mã sao chép không biết cần phải cập nhật một tệp cụ thể. Hãy thận trọng."
Temak

5

Nếu bạn đang sử dụng Anaconda, bạn có thể chạy:

conda create --name myclone --clone myenv

Điều này sẽ sao chép myenvvào môi trường mới được tạo ra được gọi là myclone.


4

Tùy chọn dễ nhất là sử dụng virtualenv-clonegói.

Để nhân bản venv1để venv2, hãy làm theo các bước sau:

  1. Cài đặt virtualenv-clonetrong một venv1hoặc một môi trường ảo giả venv_dummy. Để tạo venv_dummy:

    python -m virtualenv venv_dummy
    source venv_dummy/bin/activate
    
  2. Để cài đặt virtualenv-clone:

    (venv_dummy): pip install virtualenv-clone
  3. Để nhân đôi venv1thành venv2:

    (venv_dummy): virtualenv-clone venv1/ venv2/

lời nhắc trong bash không thay đổi, phải chỉnh sửa bin / kích hoạt và không rõ ràng 100% như thế nào
MrR

@MrR .. bạn không phải chỉnh sửa bin/activatenếu bạn làm theo câu trả lời này. Tại sao bạn phải chỉnh sửa bin/activate?
Safwan

Sau khi tôi nhân bản, dấu nhắc của tôi trong bash có tên môi trường ban đầu, vì phần PS1 bên trongbin/activate
MrR

1

Bạn có thể không đơn giản:

  • Sao chép thư mục env ảo hiện có sang thư mục mới
  • Cập nhật lên Django mới?

7
Đôi khi tôi sử dụng phương pháp này, nhưng có sự bất tiện khi phải cập nhật một số đường dẫn bên trong tập lệnh bin / kích hoạt.
Armando Pérez Marqués

3
Là sự thay đổi một tìm kiếm đơn giản và thay thế trên các tham chiếu đến tên env, hay nó phức tạp hơn thế?
Greg

1
Trong trường hợp của tôi, chỉ cần cập nhật đường dẫn trong hằng số VIRTUAL_ENV trong bin / kích hoạt đã thực hiện thủ thuật
bryanph

1
Mặt khác, việc thay đổi bin / kích hoạt khá là hack và người ta phải tự hỏi liệu điều này có thể phá vỡ mọi thứ vào một lúc nào đó không. Đặc biệt là khi môi trường ảo được sử dụng trong cài đặt sản xuất.
Herbert

2
Nó phá vỡ rất nhiều thứ. Thật dễ dàng hơn để chỉ tạo lại hoặc sao chép virtualenv. Tôi đã cố gắng làm điều này (trong khi chờ máy chủ proxy mở ra để tôi có thể cài đặt lại tất cả các gói cần thiết và chỉ bắt đầu lại từ đầu), và nó không hoạt động! Tôi nghĩ rằng tôi đã thông minh, nhưng than ôi, sẽ mất rất nhiều hack để có được điều này và chạy, và thành thật mà nói, có nhiều điều tốt hơn để làm.
horcle_buzz
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.