2012-08-15 39 views
21

我有一個腳本,我希望在全球範圍內可用。我已經與標準hashbang開始吧:從virtualenv bin中運行python腳本不起作用

#! /usr/bin/env python 

它鏈接到我的virtualenv的bin目錄:

~/environments/project/env/bin/myscript 

,並補充說目錄到我的路徑。當我運行命令:

myscript 

我得到一個導入錯誤,其中一個庫。但是,如果我激活虛擬環境並運行腳本,它將按預期工作。

我已經排除了符號鏈接的問題(我也嘗試了將腳本移動到bin文件夾中)。我也試着使用python腳本運行

python ~/environments/project/env/bin/myscript 

以前我是用一個腳本,啓動了環境,然後跑到我的劇本,但我的印象是,腳本從該文件夾運行應與virtualenv中的運行口譯員和網站包。任何想法,爲什麼這可能無法正常工作或我可以調試這種方式?

+1

與你的問題無關:即使大多數shell忽略它,使用'#! /'嚴格來說是錯誤的,因爲空間必須被視爲程序路徑的一部分。放下空間,你的安全。 – kay 2012-08-15 02:00:26

回答

35

將腳本放入virtualenv的bin中,然後將該bin位置添加到全局PATH中將不會自動獲取您的virtualenv。您需要首先獲取它以使其處於活動狀態。

您系統知道的所有內容都是檢查可執行文件的額外路徑並運行它。該腳本中沒有任何內容表示virtualenv。

你可以,但是,硬編碼她邦線到你的virtualenv蟒蛇,在這種情況下,站點包最終會在路徑上:

#!/Users/foo/environments/project/env/bin/python 

或者另一種選擇是簡單地創建一個微小bash的包裝,調用原始的蟒蛇腳本,它可以讓你用一個通用的,她爆炸留下您的原始腳本..

所以,如果myscript.py是:#!/usr/bin/env python ...

然後你就可以做一個myscript

#!/bin/bash 

/Users/foo/environments/project/env/bin/python myscript.py 

當你做myscript,它會顯式調用你設置的解釋器的Python腳本。

+0

謝謝,這就是我的原始腳本。我記得看到了一些我認爲可以激活環境的文件夾,但是你的思考方式正確,我認爲這是不可能的。 – justin 2012-08-15 02:05:05

7

我覺得你對virtualenv的工作方式感到困惑。

簡而言之,virtualenv會修改您的shell環境,以便Python在不同的區域查找您想要導入的模塊。在存儲虛擬環境的位置和存儲在virtualenv中運行的源文件的位置之間確實沒有任何關係。如果你願意,你可以將你的virtualenv存儲在一個名爲〜/ environments/my_env的目錄中,以及在〜/ projects/my_proj中使用virtualenv時編寫的所有源代碼。

您可以在文檔中閱讀有關what virtulenv does的更多信息。

真的,唯一告訴python在哪裏可以找到模塊完全基於python(see the docs關於它是如何工作的)。激活virtualenv會改變python的工作方式。

您可以返回到讓shell腳本爲您激活virtualenv,或者您可以按照this recipe直接從您的腳本激活它。

activate_this = '/path/to/env/bin/activate_this.py' 
execfile(activate_this, dict(__file__=activate_this)) 

如果你選擇這條路,保持信息的文檔記給:

這將改變sys.path中,甚至改變sys.prefix,也讓 你使用現有的翻譯。在全局項目之前,環境中的項目將首先在sys.path上顯示 。但是,全局項目 將始終可以訪問(就像--system-site-packages標誌在創建環境中使用了 ,無論是否是)。而且, 這不能撤消其他環境的激活或已導入 的模塊。例如,您不應嘗試在Web請求之前激活 環境;你應該儘早激活一個環境 ,而不是在這個過程中再做一次。

0

我面臨同樣的問題,想出了這個解決方案:https://github.com/jabbalaci/wpython。這是一個名爲「wpython」的腳本,它用你的venv中的本地Python解釋器調用你的程序。因此,代替「/Users/foo/environments/project/env/bin/python myscript.py」就足夠寫入「wpython /path/to/myscript.py」。啓動腳本可能看起來像這樣:

#!/usr/bin/env bash 

cd /the/directory/where/myscript.py/is/located 
wpython myscript.py 
2

難道你不能只是添加一個相對路徑嗎?這對我有效:

#!./env/bin/python 
0

如果您使用的是Windows,您可以在python文件的頂部包含以下行。

#! P:\Workspace\pythontut\Scripts python