Aktifkan virtualenv dengan skrip Python


91

Saya ingin mengaktifkan instance virtualenv dari skrip Python.

Saya tahu ini cukup mudah dilakukan, tetapi semua contoh yang saya lihat menggunakannya untuk menjalankan perintah di dalam env dan kemudian menutup subproses.

Saya hanya ingin mengaktifkan virtualenv dan kembali ke shell, dengan cara yang sama seperti bin / activation.

Sesuatu seperti ini:

$me: my-script.py -d env-name
$(env-name)me:

Apakah ini mungkin?

Relevan:

virtualenv ›Memanggil env dari skrip

Jawaban:


88

Jika Anda ingin menjalankan subproses Python di bawah virtualenv, Anda dapat melakukannya dengan menjalankan skrip menggunakan interpreter Python yang ada di dalam direktori / bin / virtualenv:

import subprocess

# Path to a Python interpreter that runs any Python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"

# Path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"

subprocess.Popen([python_bin, script_file])

Namun, jika Anda ingin mengaktifkan virtualenv di bawah interpreter Python saat ini alih-alih subproses, Anda dapat menggunakan activate_this.pyskrip:

# Doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))

1
//, Haruskah tidak baris terakhir di blok kode pertama pada jawaban ini berbunyi sebagai berikut: subprocess.Popen([venv_python_file, script_file])?
Nathan Basanese

//, Juga, apakah ada cara untuk menjalankan script_filedari lokasi yang sewenang-wenang, atau harus di virtualenvdirektori?
Nathan Basanese

Diperbaiki, terima kasih telah memperhatikan kesalahannya. Untuk pertanyaan kedua, tidak script_fileharus di direktori virtualenv, bisa dimana saja.
Lie Ryan

Bagaimana cara menonaktifkan virtual env, jika saya menggunakan opsi kedua?
falsePockets

@falsePockets: XY Masalah , mengapa Anda ingin melakukan itu?
Lie Ryan

42

Solusi paling sederhana untuk menjalankan skrip Anda di bawah interpreter virtualenv adalah dengan mengganti baris shebang default dengan jalur ke interpreter virtualenv Anda seperti di awal skrip:

#!/path/to/project/venv/bin/python

Jadikan skrip dapat dieksekusi:

chmod u+x script.py

Jalankan skrip:

./script.py

Voila!


2
1 untuk keanggunan. Catatan di windows ini membutuhkan lingkungan yang sesuai dengan posix yang memahami baris shebang seperti cygwin atau msys
qneill

1
Bekerja untuk python 3.6.3 dan windows 10!
toonarmycaptain

Pikir saya mungkin telah salah memahami pertanyaan asli. Dia ingin mengaktifkan lingkungan virtual dengan skrip dan kembali ke shell dengan lingkungan yang diaktifkan. Jawaban saya menjalankan skrip di lingkungan virtual tetapi shell yang dikembalikan tidak mempertahankan lingkungan. Solusi modern adalah virtualenvwrapper: virtualenvwrapper.readthedocs.io/en/latest/# . Ini memungkinkan seseorang untuk mengaktifkan dan beralih di antara berbagai virtualenv.
nafooesi

20

Ternyata, ya, masalahnya tidak sederhana, tetapi solusinya adalah.

Pertama saya harus membuat skrip shell untuk membungkus perintah "sumber". Yang mengatakan saya menggunakan "." sebaliknya, karena saya telah membaca bahwa lebih baik menggunakannya daripada sumber untuk skrip Bash.

#!/bin/bash
. /path/to/env/bin/activate

Kemudian dari skrip Python saya, saya cukup melakukan ini:

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

Seluruh trik ada di dalam --rcfileargumen.

Ketika interpreter Python keluar, ia meninggalkan shell saat ini di lingkungan yang diaktifkan.

Menang!


3
Saya benar-benar tidak mengerti. Mengapa Anda tidak melakukannya: os.system('/bin/bash --rcfile path/to/env/activate') Anda tahu, ketika sebuah instance bash dimulai, dibutuhkan .bashrc sebagai argumen untuk --rcfile. Jadi tentukan saja bahwa rcfile adalah file aktivasi Anda ... Tidak?
Depado

@ Depado Saya baru saja mencoba solusi Anda dan ini akan mengaktifkan shell di dalam python. setidaknya ketika saya mencobanya di cangkang. >>> os.system ('/ bin / bash --rcfile / var / envs / test / bin / aktifkan') (test) tcraig @ tallis-desktop: ~ $ (test) tcraig @ tallis-desktop: ~ $ ls -l total 706288
Trenton

Mungkin tapi ini berfungsi dalam skrip. Satu-satunya ketidaknyamanan dengan teknik ini adalah Anda tidak mendapatkan semua alias dan semua yang Anda miliki di ~ / .bashrc. Tapi aku baik-baik saja dengan itu. Misalnya perintah "ls" tidak memiliki warna. Tapi semuanya bekerja untuk saya. Ketika saya ingin pergi, saya hanya Ctrl + D
Depado

7
"Ketika interpreter python keluar, ia meninggalkan shell saat ini di lingkungan yang aktif" Apa? Ini memunculkan shell yang benar-benar baru sebagai subproses dan menunggu sampai selesai.
Kos

Untuk menghindari membuat lebih banyak file baru di repositori saya dan juga mereplikasi konfigurasi bash saat ini, saya melakukan ini:cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
WhyWhat

17

Untuk menjalankan lingkungan Python lain sesuai dengan dokumentasi resmi Virtualenv , di baris perintah Anda dapat menentukan jalur lengkap ke biner Python yang dapat dieksekusi, hanya itu (tidak perlu mengaktifkan virtualenv sebelumnya):

/path/to/virtualenv/bin/python

Hal yang sama berlaku jika Anda ingin menjalankan skrip dari baris perintah dengan virtualenv Anda. Anda tidak perlu mengaktifkannya sebelumnya:

me$ /path/to/virtualenv/bin/python myscript.py

Hal yang sama untuk lingkungan Windows (baik dari baris perintah atau dari skrip):

> \path\to\env\Scripts\python.exe myscript.py

2
Pertanyaannya adalah: Aktifkan virtualenv dengan skrip python (BUKAN dari Shell)
Zaheer

3
Ya, maksud saya adalah Anda bisa memanggil runtime python dari lingkungan virtual tanpa perlu mengaktifkannya sebelumnya, dari konsol atau dari skrip. Saya akan menjelaskan jawabannya, terima kasih!
Mariano Ruiz

Ya Tuhan! Saya tidak memikirkannya. ini adalah satu-satunya solusi yang berhasil untuk saya :). Sekarang, Saat saya menjalankan skrip python dari php, saya menggunakan: "path / to / virtualenv / bin / python mypythonscript.py"
Zaheer

6

Hanya solusi sederhana yang berhasil untuk saya. Saya tidak tahu mengapa Anda membutuhkan skrip Bash yang pada dasarnya melakukan langkah yang tidak berguna (apakah saya salah?)

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

Yang pada dasarnya melakukan apa yang Anda butuhkan:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$

Kemudian alih-alih menonaktifkan lingkungan virtual, cukup Ctrl+ Datau keluar. Apakah itu solusi yang mungkin atau bukankah itu yang Anda inginkan?


2

Lingkungan proses anak hilang pada saat ia tidak ada lagi, dan memindahkan konten lingkungan dari sana ke induk agak rumit.

Anda mungkin perlu menelurkan skrip shell (Anda dapat membuatnya secara dinamis ke / tmp) yang akan menampilkan variabel lingkungan virtualenv ke file, yang kemudian Anda baca dalam proses Python induk dan dimasukkan ke os.environ.

Atau Anda cukup mengurai skrip aktif yang digunakan untuk baris di buka ("bin / aktifkan"), ekstrak secara manual, dan masukkan ke os.environ. Ini rumit, tetapi bukan tidak mungkin.



2

Jawaban teratas hanya berfungsi untuk Python 2.x

Untuk Python 3.x, gunakan ini:

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

Referensi: Apa alternatif dari execfile di Python 3?


1
apa yang activation_this.py
randy Pen

1
@randyPen, file activation_this.py otomatis ditambahkan ketika Anda membangun virtualenv di direktori proyek Anda. (yaitu /project/directory/venv/bin/activate_this.py)
Secara teoritisNick

-2

Anda harus membuat semua file Anda virtualenvdalam satu folder, seperti virt.

Dengan asumsi nama folder virtualenv Anda adalah virt, jika tidak mengubahnya

cd
mkdir custom

Salin baris di bawah ini ...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

Buat file skrip shell dan tempel baris di atas ...

touch custom/vhelper
nano custom/vhelper

Berikan izin yang dapat dieksekusi ke file Anda:

sudo chmod +x custom/vhelper

Sekarang ekspor jalur folder khusus itu sehingga Anda dapat menemukannya di baris perintah dengan mengklik tab ...

ekspor PATH = $ PATH: "$ HOME / custom"

Sekarang Anda dapat menggunakannya dari mana saja hanya dengan mengetik perintah di bawah ini ...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

Misalkan abc lalu ...

vhelper abc
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.