Cara menduplikasi virtualenv

130

Saya memiliki virtualenv yang ada dengan banyak paket tetapi versi lama Django.

Yang ingin saya lakukan adalah menduplikasi lingkungan ini sehingga saya memiliki lingkungan lain dengan paket yang sama persis tetapi versi yang lebih baru dari Django. Bagaimana saya bisa melakukan ini?

dolma33
sumber
3
Saya akan mem-pip semua persyaratan Anda menjadi file 'requirement.txt' dan membuat virtualenv lain dan menjalankan pip install needs.txt
Calvin Cheng
Jika versi python dari lingkungan virtual yang ingin Anda salin berbeda dari lingkungan python default Anda, Anda dapat mengatur lingkungan baru sebagai virtualenv -p /path/to/older/venv/bin/python new_venvdan kemudian menggunakan requirements.txtyang Anda hasilkan setelahpip freeze
GiriB

Jawaban:

183

Cara termudah adalah menggunakan pip untuk menghasilkan file persyaratan. File persyaratan pada dasarnya adalah file yang berisi daftar semua paket python yang ingin Anda instal (atau sudah diinstal dalam kasus file yang dihasilkan oleh pip), dan apa versi mereka.

Untuk menghasilkan file persyaratan, buka virtualenv asli Anda, dan jalankan:

pip freeze > requirements.txt

Ini akan menghasilkan file requirement.txt untuk Anda. Jika Anda membuka file itu di editor teks favorit Anda, Anda akan melihat sesuatu seperti:

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

Sekarang, edit baris yang mengatakan Django==x.xuntuk mengatakan Django==1.3(atau versi apa pun yang ingin Anda instal di virtualenv baru Anda).

Terakhir, aktifkan virtualenv baru Anda , dan jalankan:

pip install -r requirements.txt

Dan pip akan secara otomatis mengunduh dan menginstal semua modul python yang tercantum dalam file requirement.txt Anda , pada versi apa pun yang Anda tentukan!

rdegges
sumber
3
Terima kasih! Ketika mencari di Google, saya menemukan begitu banyak halaman yang berisik, berantakan, dan membingungkan ... Solusi Anda sangat bersih dan sederhana ... itu membuat hari saya;)
dolma33
bagaimana jika saya menyalin folder dan kemudian menempelnya di komputer lain? Itu akan berhasil? Dengan asumsi tentu saja dependensi apt-get telah diselesaikan
Tales Pádua
Memang tidak, karena saya baru tahu sekarang.
horcle_buzz
Saya melihat banyak pesan. Could not find a version that satisfies the requirement a_package=#.#.#Dapatkah saya menyelesaikannya dengan mudah? Saya menghapus garis atau mengubah kesetaraan ke ketidaksetaraan.
Ubah dunia
Berfungsi untuk pyenvjuga. Jawaban yang luar biasa.
Leonard
29

Pilihan lain adalah menggunakan virtualenv-clonepaket:

Script untuk mengkloning virtualenv yang tidak dapat dipindahkan.

alecxe
sumber
Hai, apakah saya benar untuk menganggap ini memungkinkan saya untuk menyalin lingkungan python SELURUH ke dalam file. Maka saya hanya perlu memuat file ini di komputer / OS baru dan saya akan mendapatkan semua paket situs saya diinstal kembali
aceminer
2
"virtualenv-clone source / target /" bekerja seperti pesona, terima kasih!
ajankuv
pastikan kita menginstal virtualenv-clonesetelah mengaktifkan virtualenv
4givN
15

virtualenvwrappermenyediakan perintah untuk menggandakan virtualenv

cpvirtualenv ENVNAME [TARGETENVNAME]
Raymond
sumber
7
Bukan ide yang bagus. "Menyalin lingkungan virtual tidak didukung dengan baik. Setiap virtualenv memiliki informasi jalur yang dikodekan dengan keras ke dalamnya, dan mungkin ada kasus di mana kode salinan tidak tahu perlu memperbarui file tertentu. Gunakan dengan hati-hati."
Temak
5

Jika Anda menggunakan Anaconda, Anda dapat menjalankan:

conda create --name myclone --clone myenv

Ini akan menyalin myenvke lingkungan yang baru dibuat yang disebut myclone.

Yordania
sumber
4

Opsi termudah adalah menggunakan virtualenv-clone paket.

Untuk menduplikasi venv1untuk venv2, ikuti langkah berikut:

  1. Instal virtualenv-clonedi salah satu venv1atau lingkungan virtual boneka venv_dummy. Untuk membuat venv_dummy:

    python -m virtualenv venv_dummy
    source venv_dummy/bin/activate
  2. Untuk menginstal virtualenv-clone:

    (venv_dummy): pip install virtualenv-clone
  3. Untuk menggandakan venv1ke venv2:

    (venv_dummy): virtualenv-clone venv1/ venv2/
Safwan
sumber
prompt dalam bash tidak berubah, harus mengedit bin / aktifkan, dan tidak 100% jelas caranya
MrR
@ MRR .. Anda tidak perlu mengedit bin/activatejika Anda mengikuti jawaban ini. Mengapa Anda harus mengedit bin/activate?
Safwan
Setelah saya mengkloning, prompt saya di bash memiliki nama lingkungan asli, karena bagian PS1 di dalambin/activate
MrR
1

Bisakah Anda tidak hanya:

  • Salin direktori env virtual yang ada ke yang baru
  • Perbarui ke Django baru?
Spacedman
sumber
7
Beberapa kali saya menggunakan pendekatan ini, tetapi memiliki ketidaknyamanan karena harus memperbarui beberapa jalur di dalam bin / mengaktifkan skrip.
Armando Pérez Marqués
3
Apakah perubahan itu merupakan penemuan sederhana dan ganti pada referensi ke nama env, atau apakah lebih rumit dari itu?
Greg
1
Dalam kasus saya, cukup memperbarui lintasan di konstanta VIRTUAL_ENV di bin / aktifkan lakukan trik
bryanph
1
Di sisi lain, mengubah nampan / aktifkan cukup merupakan peretasan, dan orang harus bertanya-tanya apakah ini dapat merusak barang-barang di beberapa titik. Terutama ketika lingkungan virtual digunakan dalam pengaturan produksi.
Herbert
2
Itu benar-benar merusak banyak hal. Lebih mudah untuk hanya membuat ulang atau mengkloning virtualenv. Saya mencoba melakukan hal ini (sambil menunggu server proxy untuk membuka sehingga saya dapat menginstal ulang semua paket yang diperlukan dan mulai dari awal), dan itu tidak berfungsi! Saya pikir saya pintar, tetapi sayangnya, perlu banyak peretasan untuk menjalankan dan menjalankan ini, dan jujur, ada banyak hal yang lebih baik untuk dilakukan.
horcle_buzz