我有一個需要從virtualenv依賴關係的python腳本。我想知道是否有某種方法可以將它添加到我的路徑中,並讓它自動啓動它的virtualenv,運行,然後返回到系統的python。運行腳本時自動加載virtualenv
我試着玩弄autoenv和.env
,但這似乎並沒有做我正在尋找的東西。我也想過改變沙巴指向虛擬世界的道路,但這似乎很脆弱。
我有一個需要從virtualenv依賴關係的python腳本。我想知道是否有某種方法可以將它添加到我的路徑中,並讓它自動啓動它的virtualenv,運行,然後返回到系統的python。運行腳本時自動加載virtualenv
我試着玩弄autoenv和.env
,但這似乎並沒有做我正在尋找的東西。我也想過改變沙巴指向虛擬世界的道路,但這似乎很脆弱。
有兩種方法可以做到這一點:
把虛擬ENV蟒蛇的名稱到腳本的第一行。像這樣
#!/你/虛擬/ ENV /路/斌/ Python的
添加虛擬環境目錄到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的值複製到上面的代碼片段中。
這有幫助嗎?
import site
site.addsitedir('/path/to/virtualenv/lib/python2.7/site-packages/')
我認爲這裏最好的答案是創建一個簡單的腳本並將其安裝在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 install
或setup.py develop
),那麼它將會取代scripts
的第一行用的ENV蟒蛇一個shebang行(你可以用$ head /path/to/my/env/bin/crunchy-frog
驗證)。所以,無論何時運行該特定腳本,它都將使用該特定的Python env。
從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中的任何內容。
我收到這個問題,我做了一個簡單的腳本來尋找一個文件夾的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
我希望這是對你的作品
我很驚訝,沒有人沒有提到這一點,但是這就是爲什麼有一個在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')
一個非常簡單的方法是創建一個shell腳本來執行它。只需在第一行放置'path/to/venv/python path/to/script.py',新建腳本'chmod + x'並以此方式執行。 – CasualDemon