Apakah mungkin untuk menentukan apakah skrip saat ini berjalan di dalam lingkungan virtualenv?
python
virtualenv
miracle2k
sumber
sumber
Jawaban:
AFAIK cara yang paling dapat diandalkan untuk memeriksa ini (dan cara yang digunakan secara internal di virtualenv dan di pip) adalah untuk memeriksa keberadaan
sys.real_prefix
:Di dalam virtualenv,
sys.prefix
menunjuk ke direktori virtualenv, dansys.real_prefix
menunjuk ke awalan "nyata" dari sistem Python (sering/usr
atau/usr/local
atau semacamnya).Di luar virtualenv,
sys.real_prefix
seharusnya tidak ada.Menggunakan
VIRTUAL_ENV
variabel lingkungan tidak dapat diandalkan. Ini diatur olehactivate
skrip virtualenv shell, tetapi virtualenv dapat digunakan tanpa aktivasi dengan langsung menjalankan executable dari direktori virtualenvbin/
(atauScripts
), dalam hal$VIRTUAL_ENV
ini tidak akan ditetapkan.sumber
PYTHON_ENV=$(python -c "import sys; sys.stdout.write('1') if hasattr(sys, 'real_prefix') else sys.stdout.write('0')")
Coba gunakan
pip -V
(perhatikan modal V)Jika Anda menjalankan env virtual. itu akan menunjukkan jalur ke lokasi env.
sumber
virtualenv
, ada kemungkinan ini bisa gagal atau berbohong kepada Anda. Jika itu bohong, Anda bisa melakukannyafind /path/to/venv/ -type f -exec sed -ie "s:/old/path/to/venv:/path/to/venv:g" {} \+
. Jika gagal (saya mendapat "data marshal buruk") Anda harus menghapus file .pyc denganfind /path/to/venv -type f -name "*.pyc" -exec rm {} \+
(jangan khawatir, mereka akan membangun kembali secara otomatis)....\lib\site-packages
di%PATH%
. Jadi itu akan mengembalikan false positive dalam kasus itu.Ini adalah peningkatan dari jawaban yang diterima oleh Carl Meyer . Ia bekerja dengan virtualenv untuk Python 3 dan 2 dan juga untuk modul venv di Python 3:
Pemeriksaan untuk
sys.real_prefix
penutup virtualenv, persamaan non-kosongsys.base_prefix
dengansys.prefix
penutup venv.Pertimbangkan skrip yang menggunakan fungsi seperti ini:
Dan doa berikut:
sumber
def is_venv(): return hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
. Katakan saja.pipenv
lingkungan virtual yang dibuat.Periksa
$VIRTUAL_ENV
variabel lingkungan.The
$VIRTUAL_ENV
variabel lingkungan berisi direktori lingkungan virtual ketika dalam lingkungan virtual yang aktif.Setelah Anda menjalankan
deactivate
/ meninggalkan lingkungan virtual,$VIRTUAL_ENV
variabel akan dihapus / kosong. Python akan menaikkan aKeyError
karena variabel lingkungan tidak disetel.Pemeriksaan variabel lingkungan yang sama ini tentu saja dapat juga dilakukan di luar skrip Python, di shell.
sumber
virtualenv
virtualenv danvenv
virtualenv.Menurut virtualenv pep di http://www.python.org/dev/peps/pep-0405/#specification, Anda bisa menggunakan sys.prefix sebagai ganti os.environ ['VIRTUAL_ENV'].
sys.real_prefix tidak ada di virtualenv saya dan sama dengan sys.base_prefix.
sumber
sys.real_prefix
.env |grep VIRTUAL_ENV |wc -l
yang akan mengembalikan 1 jika dalam venv atau 0 jika tidak.[[ -n $VIRTUAL_ENV ]] && echo virtualenv
atau[[ -z $VIRTUAL_ENV ]] && echo not virtualenv
bergantung pada kebutuhan Anda.Untuk memeriksa apakah bagian dalam Virtualenv Anda:
Anda juga dapat memperoleh lebih banyak data tentang lingkungan Anda:
sumber
Ada beberapa jawaban bagus di sini, dan beberapa di antaranya kurang kuat. Inilah ikhtisar.
Bagaimana tidak melakukannya
Jangan bergantung pada lokasi Python atau
site-packages
folder.Jika ini disetel ke lokasi non-standar, itu tidak berarti Anda sebenarnya berada di lingkungan virtual. Pengguna dapat menginstal lebih dari satu versi Python, dan itu tidak selalu sesuai dengan yang Anda harapkan.
Hindari melihat:
sys.executable
sys.prefix
pip -V
which python
Juga, jangan periksa keberadaan
venv
,.venv
atauenvs
di jalur mana pun. Ini akan merusak lingkungan dengan lokasi yang lebih unik. Misalnya, Pipenv menggunakan nilai hash sebagai nama untuk lingkungannya.VIRTUAL_ENV
variabel lingkunganKeduanya
virtualenv
danvenv
mengatur variabel lingkungan$VIRTUAL_ENV
saat mengaktifkan suatu lingkungan. Lihat PEP 405 .Anda dapat membaca variabel ini dalam skrip shell, atau menggunakan kode Python ini untuk menentukan apakah sudah disetel.
Masalahnya adalah, ini hanya berfungsi ketika lingkungan diaktifkan oleh
activate
skrip shell.Anda dapat memulai skrip lingkungan tanpa mengaktifkan lingkungan , jadi jika itu merupakan masalah, Anda harus menggunakan metode yang berbeda.
sys.base_prefix
virtualenv
,venv
danpyvenv
arahkansys.prefix
ke Python yang terinstal di dalam virtualenv seperti yang Anda harapkan.Pada saat bersamaan, asli nilai
sys.prefix
juga dibuat tersedia sebagaisys.base_prefix
.Kita bisa menggunakannya untuk mendeteksi jika kita berada di virtualenv.
Fallback:
sys.real_prefix
Sekarang hati-hati,
virtualenv
sebelum versi 20 tidak diatursys.base_prefix
tetapi diatursys.real_prefix
sebagai gantinya.Agar aman, periksa keduanya seperti yang disarankan dalam jawaban hroncok :
Anaconda
Jika Anda menggunakan lingkungan virtual Anaconda, periksa jawaban Victoria Stuart .
sumber
running_in_virtualenv = sys.*base_*prefix != sys.prefix
if hasattr(sys, 'real_prefix'):
tes, yang tidak lagi berhasil.Anda dapat melakukan
which python
dan melihat apakah ini menunjuk ke yang ada di virtual env.sumber
which
tidak tersedia secara default di Windows. Anda bisa menggunakanwhere
hanya pada Windows, atau mempekerjakan whichcraft . Atau lihatsys.executable
. Tapi tetap saja, ada metode yang lebih baik.Saya secara rutin menggunakan beberapa lingkungan virtual yang diinstal Anaconda (venv). Cuplikan kode / contoh ini memungkinkan Anda untuk menentukan apakah Anda berada di venv (atau lingkungan sistem Anda), dan juga membutuhkan venv spesifik untuk skrip Anda.
Tambahkan ke skrip Python (cuplikan kode):
Contoh:
Perbarui 1 - gunakan dalam skrip bash:
Anda juga dapat menggunakan pendekatan ini dalam skrip bash (mis., Yang harus dijalankan dalam lingkungan virtual tertentu). Contoh (ditambahkan ke skrip bash):
Pembaruan 2 [Nov 2019]
Sejak posting asli saya, saya sudah pindah dari Anaconda venv (dan Python itu sendiri telah berevolusi viz-a-viz lingkungan virtual).
Memeriksa ulang masalah ini, berikut adalah beberapa kode Python yang diperbarui yang dapat Anda masukkan untuk menguji apakah Anda beroperasi di lingkungan virtual (vv) Python tertentu.
Berikut ini beberapa kode penjelasan.
sumber
Cara termudah adalah dengan hanya menjalankan
which python
:, jika Anda berada dalam virtualenv itu akan menunjuk ke python bukan globalsumber
(diedit) Saya menemukan cara itu, bagaimana menurut Anda? (itu juga mengembalikan jalur dasar venv dan bekerja bahkan untuk readthedocs di mana memeriksa variabel env tidak):
sumber
Ada banyak metode hebat yang sudah diposting di sini, tetapi hanya menambahkan satu lagi:
memberitahu Anda di mana
pip
menginstal paket.sumber
site.getsitepackages()
menampilkan direktori yang bukan sistem, maka Anda dapat menyimpulkan bahwa Anda berada di lingkungan virtual.virtualenv
.venv
Anda gunakan.Ini bukan anti peluru tetapi untuk lingkungan UNIX seperti tes sederhana
bekerja bagus untukku. Lebih sederhana daripada menguji ada beberapa atribut dan, bagaimanapun, Anda harus memberi nama direktori venv Anda
venv
.sumber
Di OS windows Anda melihat sesuatu seperti ini:
Tanda kurung berarti bahwa Anda sebenarnya berada di lingkungan virtual yang disebut "virtualEnvName".
sumber
Sebuah potensi solusi adalah:
Dalam kasus saya, saya benar-benar hanya ingin mendeteksi apakah saya dapat menginstal item dengan pip apa adanya. Meskipun ini mungkin bukan solusi yang tepat untuk semua kasus, pertimbangkan untuk memeriksa apakah Anda memiliki izin menulis untuk lokasi eksekusi Python.
Catatan: ini berfungsi di semua versi Python, tetapi juga kembali
True
jika Anda menjalankan sistem Pythonsudo
. Berikut ini adalah kasus penggunaan potensial:sumber
Ini adalah pertanyaan lama, tetapi terlalu banyak contoh di atas terlalu rumit.
Keep It Simple: (dalam terminal Jupyter Notebook atau Python 3.7.1 pada Windows 10)
sumber
envs
di jalur itu, ini akan berhenti berfungsi ketika Anda berpindah dari anaconda kevirtualenv
ataupipenv
.