Bir Python betiği ile bir virtualenv'i etkinleştirin


91

Bir Python komut dosyasından bir virtualenv örneğini etkinleştirmek istiyorum.

Yapmanın oldukça kolay olduğunu biliyorum, ancak gördüğüm tüm örnekler bunu env içinde komutları çalıştırmak ve ardından alt işlemi kapatmak için kullanıyor.

Bin / activ'in yaptığı gibi, virtualenv'i etkinleştirmek ve kabuğa geri dönmek istiyorum.

Bunun gibi bir şey:

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

Mümkün mü?

İlgili:

virtualenv ›Bir komut dosyasından bir ortam çağırma

Yanıtlar:


88

Virtualenv altında bir Python alt işlemi çalıştırmak istiyorsanız, virtualenv'in / bin / dizini içinde bulunan Python yorumlayıcısını kullanarak betiği çalıştırarak bunu yapabilirsiniz:

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])

Bununla birlikte, virtualenv'i bir alt işlem yerine mevcut Python yorumlayıcısı altında etkinleştirmek istiyorsanız, activate_this.pykomut dosyasını kullanabilirsiniz :

# 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
Aşağıdaki gibi // Meli Bu yanıt hakkındaki ilk kod bloğu son satır okumak değil: subprocess.Popen([venv_python_file, script_file])?
Nathan Basanese

//, Ayrıca, script_filerasgele bir konumdan çalıştırmanın bir yolu var mı , yoksa virtualenvdizinde olması mı gerekiyor ?
Nathan Basanese

Düzeltildi, hatayı fark ettiğiniz için teşekkürler. İkinci sorunuza gelince script_file, virtualenv dizininde olmak zorunda değil, her yerde olabilir.
Lie Ryan

İkinci seçeneği kullanıyorsam, sanal ortamı nasıl devre dışı bırakabilirim?
falsePockets

@falsePockets: XY Problem , neden bunu yapmak istiyorsun?
Lie Ryan

42

Komut dosyanızı virtualenv'in yorumlayıcısı altında çalıştırmanın en basit çözümü, komut dosyasının başlangıcında olduğu gibi, varsayılan shebang satırını virtualenv'in yorumlayıcısının yolu ile değiştirmektir:

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

Komut dosyasını çalıştırılabilir yapın:

chmod u+x script.py

Komut dosyasını çalıştırın:

./script.py

Voila!


2
Zarafet için +1. Windows üzerinde bunun cygwin veya msys gibi shebang satırlarını anlayan posix uyumlu bir ortam gerektirdiğini unutmayın
qneill

1
Python 3.6.3 ve Windows 10 için çalışıyor!
toonarmycaptain

Asıl soruyu yanlış anlamış olabilirim. Sanal ortamı bir komut dosyasıyla etkinleştirmek ve etkinleştirilen ortamla kabuğa dönmek istiyor. Cevabım komut dosyasını sanal ortamda çalıştırıyor ancak döndürülen kabuk ortamı korumuyor. Günümüzün modern çözümü virtualenvwrapper'dır: virtualenvwrapper.readthedocs.io/en/latest/# . Birinin farklı sanal ortamları etkinleştirmesine ve aralarında geçiş yapmasına izin verir.
nafooesi

20

Görünüşe göre evet, sorun basit değil, ama çözüm öyle.

Önce "kaynak" komutunu sarmak için bir kabuk betiği oluşturmam gerekiyordu. Bu "" ı kullandım dedi. bunun yerine, Bash betikleri için kaynak kullanmaktan daha iyi olduğunu okudum.

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

O zaman Python betiğimden şunu yapabilirim:

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

Bütün numara --rcfileargümanda yatıyor .

Python yorumlayıcı çıktığı zaman, mevcut kabuğu aktif ortamda bırakır.

Kazanın!


3
Ben gerçekten anlamıyorum. Neden bunu yapmıyorsun: os.system('/bin/bash --rcfile path/to/env/activate') Bilirsin, bir bash örneği başlatıldığında, --rc dosyası için argüman olarak .bashrc alır. Bu nedenle, rcfile'ın sizin etkinleştirme dosyanız olduğunu belirtin ... Hayır?
Depado

@Depado Az önce çözümünüzü denedim ve bu python içindeki kabuğu etkinleştirecek. en azından kabukta denediğimde. >>> os.system ('/ bin / bash --rcfile / var / envs / test / bin / activs') (test) tcraig @ tallis-desktop: ~ $ (test) tcraig @ tallis-desktop: ~ $ ls -l toplam 706288
Trenton

Belki ama bu bir senaryoda çalışıyor. Bu tekniğin tek sakıncası, tüm takma adlarınızı ve ~ / .bashrc dosyanızdaki her şeyi alamamanızdır. Ama bunda iyiyim. Örneğin "ls" komutunun rengi yoktur. Ama her şey benim için çalışıyor. Ayrılmak istediğimde, sadece Ctrl + D
Depado

7
"Python yorumlayıcısı çıktığı zaman, mevcut kabuğu aktifleştirilmiş ortamda bırakır" Ne? Alt işlem olarak tamamen yeni bir kabuk ortaya çıkarır ve bitene kadar bekler.
Kos

cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
Depomda

17

Resmi Virtualenv belgelerine göre başka bir Python ortamını çalıştırmak için, komut satırında çalıştırılabilir Python ikili dosyasının tam yolunu belirtebilirsiniz, sadece bu (daha önce virtualenv'i etkinleştirmeye gerek yoktur):

/path/to/virtualenv/bin/python

Virtualenv'inizle komut satırından bir komut dosyası çağırmak isterseniz de aynısı geçerlidir. Daha önce etkinleştirmenize gerek yoktur:

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

Windows ortamı için de aynısı (ister komut satırından ister komut dosyasından olsun):

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

2
Soru: Bir python komut dosyasıyla bir virtualenv'i etkinleştirin (Shell'den DEĞİL)
Zaheer

3
Evet, demek istediğim, python çalışma zamanını daha önce onu etkinleştirmeye gerek kalmadan, konsoldan veya bir komut dosyasından sanal bir ortamdan çağırabilirsiniz. Cevabı netleştireceğim, teşekkürler!
Mariano Ruiz

Aman tanrım! Bunun hakkında düşünmedim. benim için çalışan tek çözüm bu :). Şimdi, php'den python betiğini çalıştırırken, kullanıyorum: "path / to / virtualenv / bin / python mypythonscript.py"
Zaheer

6

Benim için çalışan basit bir çözüm. Temelde işe yaramaz bir adım olan Bash betiğine neden ihtiyacınız olduğunu bilmiyorum (yanılıyor muyum?)

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

Temelde ihtiyacınız olan şeyi yapan:

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

Ardından sanal ortamı devre dışı bırakmak yerine Ctrl+ Dveya çıkın. Bu olası bir çözüm mü yoksa istediğin bu değil mi?


2

Çocuk süreç ortamı, varlığı sona erdiği anda kaybolur ve ortam içeriğini oradan ebeveyne taşımak biraz zordur.

Virtualenv ortam değişkenlerini daha sonra ana Python sürecinde okuyup os.environ'a koyacağınız bir dosyaya çıktı verecek bir kabuk betiği (/ tmp'ye dinamik olarak oluşturabilirsiniz) oluşturmanız gerekebilir.

Ya da, açıktaki ("bin / etkinleştir") satır için kullanarak, basitçe etkinleştirme betiğini ayrıştırır, malzemeleri elle çıkarır ve os.environ'a koyarsınız. Zor, ama imkansız değil.


2
Bunun gibi bir şey mi ifade etmeye çalışıyorsun ? bitbucket.org/ianb/virtualenv/src/1f9dfb2437f1/…
h3.

2

En iyi cevap yalnızca Python 2.x için işe yarar

Python 3.x için şunu kullanın:

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))

Referans: Python 3'te execfile'a bir alternatif nedir?



1
@randyPen, active_this.py dosyası proje dizininizde virtualenv oluşturduğunuzda otomatik olarak eklenir. (yani /project/directory/venv/bin/activate_this.py)
TheoreticallyNick

-2

Tüm virtualenve-postalarınızı gibi tek bir klasörde oluşturmalısınız virt.

Virtualenv klasör adınızın değiştirilmemesi durumunda, sanal olduğunu varsayarsak

cd
mkdir custom

Aşağıdaki satırları kopyalayın ...

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

Bir kabuk komut dosyası oluşturun ve yukarıdaki satırları yapıştırın ...

touch custom/vhelper
nano custom/vhelper

Dosyanıza yürütülebilir izin verin:

sudo chmod +x custom/vhelper

Şimdi bu özel klasör yolunu dışa aktarın, böylece sekmeyi tıklayarak komut satırında bulabilirsiniz ...

dışa aktar PATH = $ PATH: "$ HOME / özel"

Şimdi sadece aşağıdaki komutu yazarak istediğiniz yerden kullanabilirsiniz ...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

Varsayalım ki abc o zaman ...

vhelper abc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.