2014-05-15 104 views
15

我有一個需要從virtualenv依賴關係的python腳本。我想知道是否有某種方法可以將它添加到我的路徑中,並讓它自動啓動它的virtualenv,運行,然後返回到系統的python。運行腳本時自動加載virtualenv

我試着玩弄autoenv和.env,但這似乎並沒有做我正在尋找的東西。我也想過改變沙巴指向虛擬世界的道路,但這似乎很脆弱。

+1

一個非常簡單的方法是創建一個shell腳本來執行它。只需在第一行放置'path/to/venv/python path/to/script.py',新建腳本'chmod + x'並以此方式執行。 – CasualDemon

回答

15

有兩種方法可以做到這一點:

  1. 把虛擬ENV蟒蛇的名稱到腳本的第一行。像這樣

    #!/你/虛擬/ ENV /路/斌/ Python的

  2. 添加虛擬環境目錄到sys.path中。請注意,您需要導入sys庫。像這樣

    進口SYS

    sys.path.append( '/路徑/要/虛擬/ env的/ lib目錄')

如果使用第二個選項去,你可能需要添加多個路徑到sys.path(網站等)。獲得它的最好方法是運行你的虛擬env python解釋器,並找出sys.path的值。像這樣:

/your/virtual/env/bin/python 

Python blah blah blah 

> import sys 
> print sys.path 
[ 'blah', 'blah' , 'blah' ] 

將sys.path的值複製到上面的代碼片段中。

0

這有幫助嗎?

import site 
site.addsitedir('/path/to/virtualenv/lib/python2.7/site-packages/') 
3

我認爲這裏最好的答案是創建一個簡單的腳本並將其安裝在virtualenv中。然後你可以直接使用腳本,或者創建一個符號鏈接,或者其他什麼。

下面是一個例子:

$ mkdir my-tool 
$ cd my-tool 
$ mkdir scripts 
$ touch setup.py 
$ mkdir scripts 
$ touch scripts/crunchy-frog 
$ chmod +x scripts/crunchy-frog 

脆脆蛙

#!/usr/bin/env python 
print("Constable Parrot ate one of those!") 

setup.py

from setuptools import setup 

setup(name="my-cool-tool", 
     scripts=['scripts/crunchy-frog'], 
    ) 

現在:

$ source /path/to/my/env/bin/activate 
(env) $ python setup.py develop 
(env) $ deactivate 
$ cd ~ 
$ ln -s /path/to/my/env/bin/crunchy-frog crunchy-frog 
$ ./crunchy-frog 
Constable Parrot ate one of those! 

當您安裝腳本(通過setup.py installsetup.py develop),那麼它將會取代scripts的第一行用的ENV蟒蛇一個shebang行(你可以用$ head /path/to/my/env/bin/crunchy-frog驗證)。所以,無論何時運行該特定腳本,它都將使用該特定的Python env。

4

從virtualenv中documentation

如果直接運行腳本或從 virtualenv中的bin /目錄Python解釋器(例如,路徑/到/ ENV /斌/ PIP或 /路徑/到/ env/bin/python script.py),不需要激活。

所以,如果你只需要調用蟒蛇可執行在你的virtualenv,你的virtualenv將是「積極的」。所以,你可以創建一個這樣的腳本:

#!/bin/bash 

PATH_TO_MY_VENV=/opt/django/ev_scraper/venv/bin 

$PATH_TO_MY_VENV/python -c 'import sys; print(sys.version_info)' 
python -c 'import sys; print(sys.version_info)' 

當我在我的系統上運行此腳本時,兩次調用蟒紋你所看到的下面。 (Python的3.2.3在我的virtualenv和2.7.3是我的系統的Python)。

sys.version_info(major=3, minor=2, micro=3, releaselevel='final', serial=0) 
sys.version_info(major=2, minor=7, micro=3, releaselevel='final', serial=0) 

所以,當你調用$PATH_TO_MY_VENV/python你已經安裝在你的virtualenv任何庫將可用。打電話給您的常規系統python當然不會意識到virtualenv中的任何內容。

0

我收到這個問題,我做了一個簡單的腳本來尋找一個文件夾的virtualenv遞歸剛剛導入和調用函數:

script_autoenv.py

# -*- coding:utf-8 -*- 
import os, site 

def locate_env(path, env_name): 
    """search for a env directory name in each directory in the path""" 
    if os.path.isdir(path + "/env"): 
     env_26_path = '%s/%s/lib/python2.6/site-packages/' % (path, env_name) 
     env_27_path = '%s/%s/lib/python2.7/site-packages/' % (path, env_name) 


     if os.path.isdir(env_26_path): 
      site.addsitedir(env_26_path) 
      print "Virtualenv 2.6 founding" 
     elif os.path.isdir(env_27_path): 
      site.addsitedir(env_27_path) 
      print "Virtualenv 2.7 founding" 
    else: 
     new_path, old_dir = os.path.split(path) 
     if old_dir: 
      locate_env(new_path, env_name) 
     else: 
      print "No envs found" 

你只需要指定腳本目錄和env名稱文件夾以及腳本完成以下工作:

test.py

# -*- coding:utf-8 -*- 

import os 
import script_autoenv 
script_autoenv.locate_env(os.path.realpath(__file__), 'env') 

import django 
print django.VERSION 

我希望這是對你的作品

8

我很驚訝,沒有人沒有提到這一點,但是這就是爲什麼有一個在virtualenv中的bin目錄下名爲activate_this.py文件。您可以將其傳遞給execfile()以更改當前運行的解釋器的模塊搜索路徑。

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

您可以將此文件置於腳本的頂部,以強制腳本始終在該virtualenv中運行。與修改hashbang不同,你可以使用相對路徑:

script_directory = os.path.dirname(os.path.abspath(__file__)) 
activate_this_file = os.path.join(script_directory, '../../relative/path/to/env/bin/activate_this.py')