Bisakah saya memindahkan virtualenv?

93

Pertanyaan ini bukan duplikat.

Ini berkaitan tidak hanya dengan mengganti nama lingkungan virtual, tetapi untuk benar - benar memindahkannya ke direktori yang berbeda, termasuk, berpotensi, direktori pengguna yang berbeda.

Ini tidak sama dengan hanya mengganti nama lingkungan virtual, terutama untuk orang yang tidak terbiasa dengan virtualenv.

Jika saya membuat virtualenv, dan saya memindahkannya ke folder lain, apakah masih berfungsi?

$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv
$ source Env/my-python-venv/bin/activate
(my-python-venv) $ 

... kemudian pada hari itu, lingkungan virtual BERGERAK ...

(my-python-venv) $ deactivate
$ mkdir -p /home/me/PeskyPartyPEnvs
$ mv /home/me/Env/my-python-venv /home/me/PeskyPartyPEnvs/

Pertanyaan:

Akankah ini berhasil?

$ source /home/me/PeskyPartyPEnvs/my-python-venv/bin/activate
(my-python-venv) $ /home/me/PeskyPartyPEnvs/my-python-venv/bin/pip3 install foaas

Maksud saya ini bukan pertanyaan tentang kebijaksanaan mencoba ini (kecuali jika kebijaksanaan itu lucu, tentu saja), dan lebih banyak tentang apakah itu mungkin. Saya benar-benar ingin tahu apakah itu mungkin dilakukan dengan Python 3, atau apakah saya hanya perlu menyedotnya dan mengkloningnya.

Dapatkah saya hanya mvseorang virtualenvseperti itu tanpa kesedihan? Saya ingin menghindari kesedihan.

Nathan Basanese
sumber

Jawaban:

70

Iya. Dimungkinkan untuk memindahkannya pada platform yang sama. Kamu dapat memakai--relocatable di lingkungan yang ada.

Dari --help:

--relocatable - Membuat lingkungan virtualenv YANG ADA dapat direlokasi. Ini memperbaiki skrip dan membuat semua file .pth menjadi relatif.

NAMUN, ini sepertinya TIDAK mengubah activateskrip, dan hanya mengubah skrip pip*dan easy_install*. Dalam activateskrip, $VIRTUAL_ENVvariabel lingkungan di-hardcode seperti aslinya /path/to/original/venv. The $VIRTUAL_ENVvariabel digunakan untuk mengatur PATHlingkungan aktif Anda juga, sehingga harus diubah berdasarkan lokasi baru untuk memanggil pythondan piplain-lain tanpa path absolut.

Untuk memperbaiki masalah ini, Anda dapat mengubah $VIRTUAL_ENVvariabel lingkungan di activateskrip (misalnya menggunakansed ), dan semuanya akan baik-baik saja.

Contoh penggunaan:

$ cd ~/first
$ virtualenv my-venv
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV="/home/username/first/my-venv"
$ virtualenv --relocatable my-venv
Making script my-venv/bin/easy_install relative
Making script my-venv/bin/easy_install-2.7 relative
Making script my-venv/bin/pip relative
Making script my-venv/bin/pip2 relative
Making script my-venv/bin/pip2.7 relative
### Note that `activate` has not been touched
$ mkdir ~/second
$ mv my-venv ~/second
$ cd ~/second
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV=/home/username/first/my-venv
### (This variable hasn't been changed, it still refers to the old, now non-existent directory!)
$ sed -i -e 's|username/first|username/second|' my-venv/bin/activate
## sed can be used to change the path.
## Note that the `-i` (in place) flag won't work on all machines. 
$ source my-venv/bin/activate 
(my-venv) $ pip install foass
...
(my-venv) $ python 
[...]
> import foass

Hore, sekarang Anda dapat menginstal sesuatu dan memuatnya ke lingkungan virtual yang baru Anda temukan.

hilcharge
sumber
//, Hm. Ini tampaknya tidak benar-benar membuat ini bisa direlokasi. Saya terus mendapatkan kesalahan tentang file skrip yang tidak "normal".
Nathan Basanese
7
"Opsi - yang dapat direlokasi saat ini memiliki sejumlah masalah, dan tidak dijamin akan berfungsi di semua situasi. Ada kemungkinan bahwa opsi tersebut akan dihentikan di versi virtualenv mendatang. " (Penekanan milik saya) lihat panduan pengguna
BobTuckerman
1
Saya mencoba ini di windows dan kesalahan mencantumkan semua skrip (* .py, * .bat, * .ps1) di Scripts dir (setara dengan binon * nix) dan mengatakan sesuatu seperti activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.pada dasarnya mengeluh bahwa hash-bang di file header bukan python.exe virtualenv saat ini, itu yang saya pindahkan dari -mudah diperbaiki. Saya melihat di skrip mewah itu dan toh sudah menemukan jalannya sendiri - bagus. Beberapa skrip lain juga tidak bergantung pada jalur (mis. Deactivate.bat) jadi singkatnya, ini berfungsi.
Davos
2
@NathanBasanese pesan activate.ps1 cannot be made relativedapat diabaikan karena skrip tersebut sudah relatif. Pesan tersebut tidak membantu di Windows, karena skrip tidak menggunakan #!arahan seperti di Linux untuk memberi tahu shell aplikasi mana yang harus menjalankannya. Tidak activate.batbisa diubah, tetapi tidak digunakan (setidaknya di windows 10, memanggilactivate meluncurkan skrip PoSH) jadi tidak, saya tidak perlu mengedit skrip apa pun. Masalahnya adalah pip.exemana yang memiliki jalur ke kode keras python dan perlu diedit dengan hex-editor, atau hanya menginstal ulang.
Davos
3
@Sgedda Dalam retrospeksi, saya akan mengatakan jangan lakukan ini. Lingkungan python Anda harus dapat dibuat ulang dengan mudah menggunakan minimal pip freezeke file persyaratan sehingga Anda dapat dengan mudah menginstal ulang semua paket Anda, buruh pelabuhan (bekerja dengan baik dengan virtualenv diinstal di atasnya), conda, pyenv atau beberapa alat lainnya. Anda harus dapat membuat & menghancurkan lingkungan sebagai infrastruktur yang tidak dapat diubah, lingkungan tersebut seharusnya tidak berharga.
Davos
19

Untuk Python 3.3+ (dengan baru venv modul built-in baru)

Jawaban Singkat (terlepas dari versinya):

  • Tidak ada cara yang bersih dan langsung untuk memindahkan lingkungan virtual
  • Buat ulang saja, itu mudah !!


Jawaban panjang:

Pada Python v3.3, virtualenvtelah menjadi modul built-in bernamavenv .

The --relocatablepilihan yang disebutkan dalam jawaban lainnya belum termasuk dalamvenv , dan saat ini tidak ada yang baik, cara yang aman bahwa aku sadar baik mengubah nama atau pindah lingkungan virtual Python.

Namun, ada cara yang cukup sederhana untuk membuat ulang lingkungan virtual, dengan semua paket yang terinstal saat ini. Lihat jawaban ini , atau lihat bagian di bawah ini untuk informasi tentang membuat ulang lingkungan virtual. Selama proses tersebut, Anda dapat menciptakan kembali lingkungan baru di lokasi mana pun dan dengan nama apa pun yang Anda inginkan. Atau lihat bagian di bawah ini untuk prosesnya.

Dalam jawaban itu, dia menyebutkan beberapa paket pihak ke-3 lainnya yang mungkin mendukung penggantian nama atau pemindahan langsung. Jika Anda memutuskan untuk mengejar cara untuk memindahkan lingkungan virtual secara utuh, Anda dapat melihat apakah itu juga berfungsi venv.

Catatan: Dalam jawaban itu, ini difokuskan pada virtualenv, bukan venv. Lihat di bawah untuk mengetahui cara menerjemahkan.



venv vs. lebih tua virtualenv sintaks perintah yang

Perintah yang digunakan venvadalah:

python -m venv

bukan hanya virtualenv, yang menginstal sebagai perintah dalam paket aslinya. Di mana "python" mengacu pada bagaimana pun Anda menjalankan python Anda yang dapat dieksekusi, yang dapat berupa berbagai hal, seperti:

  1. python
  2. pyatau py -3.7atau serupa ( Peluncur Python untuk Windows untuk Python 3.3+ dan hanya untuk Windows saat ini)
  3. python3 (konvensi untuk lingkungan linux yang menginstal ganda python 2 dan 3)
  4. Jika Anda mengalami masalah, gunakan jalur absolut ke python yang dapat dieksekusi yang ingin Anda jalankan: mis c:\program files\python37\python.exe

Jika Anda tidak yakin versi mana yang sedang dijalankan, Anda selalu python --versiondapat mencari tahu.



Cara membuat ulang lingkungan virtual

Membuat / membuat ulang lingkungan virtual itu mudah dan harus menjadi kebiasaan setelah Anda bekerja dengannya sebentar. Proses ini mencerminkan apa yang akan Anda lakukan untuk mendistribusikan skrip Anda sebagai paket (dengan dependensinya) di paruh pertama, dan kemudian apa yang akan dilakukan seseorang untuk menginstal skrip / paket Anda untuk pengembangan lebih lanjut.

Pertama, dapatkan daftar terbaru dari apa yang ada di lingkungan virtual. Dengan itu aktif, dapatkan versi Python yang digunakannya dan simpan daftar dependensi ke file.

  1. Gunakan python --versiondengan lingkungan virtual yang diaktifkan untuk melihat versi Python yang digunakannya.

    • Ini untuk kejelasan - Anda mungkin ingin memperbarui versi Python karena berbagai alasan - setidaknya ke versi tambalan terbaru
    • Misalnya, jika venv yang ada menggunakan Python v3.7.4, tetapi sekarang v3.7.6 tidak ada - gunakan v3.7.6 sebagai gantinya, yang seharusnya hanya menyertakan perbaikan keamanan dan bug yang tidak melanggar.
  2. Gunakan python -m pip freeze > requirements.txtuntuk membuat daftar dependensi paket saat ini dan memasukkannya ke dalam requirements.txtfile. Perintah ini pasti berfungsi di Linux atau Git Bash - tidak 100% yakin tentang Powershell atau Command Line di Windows.

Sekarang buat lingkungan virtual baru dan tambahkan dependensi dari yang lama.

  1. Jadikan tempat baru Anda.

    • Pastikan Anda menggunakan versi python yang benar yang ingin Anda instal ke venv.
    • Jika Anda ingin versi Python yang sama persis:
      • Jalankan python langsung dari lingkungan virtual saat ini (dengan itu diaktifkan), dan cukup gunakan pythonsebagai perintah
      • Atau gunakan jalur absolut dengan python.exedi folder lingkungan virtual
    • Untuk entri folder venv baru di perintah:
      • Tambahkan jalur absolut atau relatif ke lokasi folder akhir yang diinginkan.
      • Gunakan python -m venv my_new_venvuntuk membuat lingkungan virtual baru di direktori kerja saat ini di my_new_venvfolder baru .
      • Nama folder venv akan menjadi nama venv (yang muncul di prompt ketika diaktifkan).
  2. Instal dependensi Anda dari requirements.txtfile.

    • python -m pip install -r requirements.txt

Anda mungkin perlu menginstal ulang paket lokal yang ada dalam mode pengembangan.

Catatan, jika Anda perlu melihat lokasi spesifik tempat paket diinstal, gunakan:

  • python -m pip list -v
  • Opsi -vatau "verbose" akan menambahkan beberapa informasi tambahan tentang setiap paket yang diinstal, termasuk jalur penginstalannya. Ini berguna untuk memastikan Anda menjaga paket virtual, pengguna, dan sistem yang terinstal tetap lurus.

Pada titik ini Anda bisa menghapus folder venv lama dan semua isinya. Saya merekomendasikan menggunakan GUI untuk itu - penghapusan file seringkali permanen dari baris perintah linux, dan kesalahan ketik kecil bisa menjadi berita buruk.

LightCC
sumber
Apakah tidak ada cara untuk menyalin status venv pip, yaitu tanpa harus mendownload ulang semua library dengan pip?
Aydo
Saya tidak yakin alasan Anda ingin melakukannya - apakah karena situasi bandwidth yang sangat rendah ke internet atau kebutuhan besar untuk menggandakan banyak? Saya yakin Anda bisa mendapatkan semua ritsleting dari pypi dan kemudian menginstal secara lokal, tapi saya tidak mempercepatnya. Saya tahu Anda dapat mengatur server pip lokal untuk meng-host paket.
LightCC
Masalah (yang saya coba pecahkan) adalah saya ingin menjalankan skrip python pada mesin yang tidak mengizinkan lalu lintas jaringan ke pip (atau, hampir di mana saja). Saya dapat meletakkan file di dalamnya, tetapi tidak dapat berbicara dengan pip. Kasus khusus yang pasti tetapi mengapa saya perlu memindahkan hal-hal ini.
Richard Rast
@RichardRast Itu masalah yang berbeda, saya hanya menjawab pertanyaan awal. Catatan: ada solusi untuk masalah Anda (unduh paket sebagai zip dan instal secara lokal, jalankan server mirror PyPi di belakang firewall Anda, dll.), Tetapi ini tidak benar: T&J untuk itu ..
LightCC
2
Anda dapat membuat roda dari semua paket Anda dengan pip wheel . -w wheelsdan kemudian menginstal ulang paket di lingkungan virtual baru denganpip install --no-index --find-links /path/to/wheels/ -r requirements.txt
np8
7

The --relocatableargumen untuk virtualenvmuncul untuk memungkinkan Anda untuk melakukan hal ini.

Ruth Franklin
sumber
//, Apakah ini hanya bergantung pada jalur relatif, atau apakah itu berkeliaran entah bagaimana sebaliknya?
Nathan Basanese
1
--relocatable hanya berfungsi pada lingkungan virtual yang ada. Jalankan virtualenv --relocatable my-python-venvSETELAH lingkungan sudah ada.
hilcharge
1
Dari --help: This fixes up scripts and makes all .pth files relative. Tidak, itu tidak akan membuat perpustakaan platform independen. Jika Anda ingin memindahkannya ke platform lain, Anda harus menginstalnya kembali berdasarkan python lokal.
hilcharge
5
modul python3 venv tidak mendukung tanda ini
Nelson
7

TAPI ALAS:

Tidak, Anda tidak bisa begitu saja mv. Ada beberapa solusi, tetapi mungkin lebih mudah untuk menginstal ulang.

(my-python-venv)$ /home/me/PeskyPartyPEnvs/pip3 install foaas
zsh: /home/me/PeskyPartyPEnvs/pip3: bad interpreter: /home/me/Env/my-python-venv/bin/python3: no such file or directory
(my-python-venv)$ deactivate
$ 

... menekan enterbanyak karena frustrasi, dan berikut ini berhasil

$
$
$ pip3 search foaas

Kecuali itu bukan dari my-python-venv, ergo kesedihan.

Ingin mvAnda virtualenvdan menggunakannya, jika tidak diubah?

Jawaban singkat:

Saya akan membiarkan Boromir mengatakannya, jadi dia bisa menjelaskan:

Ya tidak bisa .

Nathan Basanese
sumber
2
kecuali jika Anda ingin mendapatkan berdarah dan memodifikasinya dengan tepat: Tautan dalam biner di tempat sampahlah yang menyebabkan masalah pergerakan. Jika Anda tahu dari mana Anda berasal, Anda dapat menggunakan sesuatu seperti find bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;mengasumsikan bin dan lib Anda ada di folder venv Anda saat ini. Saya menggunakan ini sebagai cara cepat dan kotor untuk menyalin dan memindahkan python3 virtual envs dengan banyak paket pip terpasang.
Paul Whipp
1
@PaulWhipp Apakah ada manfaat menggunakan perintah itu dibandingkan hanya menggunakan --relocatable? Juga, Nathan, pertanyaan yang bagus tapi ini jawaban yang buruk. Menerima jawaban Anda sendiri selalu sedikit bias, kecuali jika ditulis dengan baik dan dengan jelas menyebutkan pilihannya, tetapi menentukan bahwa diri Anda tetap subjektif.
Davos
1
@Davos --relocatable tidak berfungsi untuk saya tetapi saya secara rutin memindahkan python3 venvs dengan meretas binari dan sejauh ini saya tidak mengalami masalah.
Paul Whipp
1
Saya mengisyaratkan bahwa Anda harus mengubah diterima ke jawaban yang berbeda (yaitu bukan milik Anda) Mungkin yang dipilih oleh orang-orang: D
Davos
3
Pertanyaannya adalah "dapatkah saya hanya mvsebuah venv?", Dan jawabannya adalah "tidak, Anda tidak bisa begitu saja mv, ada beberapa solusi tetapi mungkin lebih mudah untuk menginstal ulang". Jika ini adalah jawaban teratas, itu akan menghemat waktu saya dan orang lain.
Nickolay
5

Ya, ini dapat dilakukan jika Anda belum melakukan apa pun yang bergantung pada direktori virtualenv saat ini.

Namun, jika Anda punya pilihan, hal terbaik yang harus dilakukan adalah membuat virtualenv baru dan mulai menggunakan virtualenv baru sebagai gantinya. Ini adalah pilihan teraman dan paling tidak menyebabkan masalah nantinya.

Dokumentasi tersebut menyebutkan bahwa :

Setiap virtualenv memiliki informasi jalur yang di-hardcode ke dalamnya,

Misalnya, jika Anda telah menjalankannya setvirtualenvprojectmaka itu tidak akan dapat beralih ke direktori yang benar setelah Anda menjalankannya workon ...sehingga Anda harus memperbaikinya secara manual.

Secara umum virtualenv tidak lebih dari sebuah direktori dengan file interpreter Python yang diperlukan ditambah paket yang Anda butuhkan.

Simeon Visser
sumber
3

Menggunakan jawaban dari utas ini dan utas lainnya tentang topik serupa, saya telah membuat skrip bash yang, terletak dan dijalankan dalam direktori virtualenv itu sendiri , akan membantu gerakan virtualenv Anda.

Setelah melakukannya, virtualenv --relocatable yourenvAnda harus mengubah VIRTUAL_ENVvariabel setiap kali Anda memindahkan direktori, jadi jika Anda tidak ingin mengubahnya secara manual, gunakan ini.

#!/bin/bash \n 
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
EXISTING=$(grep 'VIRTUAL_ENV=' bin/activate)  
NEWDIR=VIRTUAL_ENV=\"$DIR\"
sed -i -e "s|$EXISTING|$NEWDIR|" bin/activate
source bin/activate

Saya harap ini membantu.

Gerbs
sumber
1

YA KAMU BISA! (Dalam windows)

Solusinya mudah, cukup pindahkan lingkungan virtual Anda ke mana saja lalu edit activate.batdi dalam scripts\:

  1. Pindah ke lingkungan virtual ke direktori yang diinginkan

  2. Klik kanan dan edit yang activate.batterletak di venv_folder\scripts.

  3. Ubah VIRTUAL_ENVvariabel dari:

     set VIRTUAL_ENV=C:\old_directory\venv_name
    

    ke

     set VIRTUAL_ENV=C:\new_directory\venv_name
    
  4. Simpan file batch yang telah diedit, dan selesai!

CATATAN: Solusi saya harus berfungsi dan menyimpan windows userspengaturan lingkungan virtual baru, saya ragu ini akan berfungsi di sistem operasi lain karena .batdariMS-DOS

kyle olodin
sumber
1
Ubah old_directoryke old_directory- apakah itu salah ketik?
ack