2009-11-05 30 views
1

我在一個存儲庫的簽出副本中對python模塊進行了一些更改,並且需要對其進行測試。但是,當我嘗試運行使用該模塊的腳本時,它會繼續從存儲庫的主幹中導入模塊,這對我來說沒有用處。如何讓Python選擇正確的模塊而無需手動修改sys.path?

我試着設置PYTHONPATH,它什麼也沒做。經過一番搜索之後,我發現在site-packages目錄下的.pth文件中的任何內容都會放在PYTHONPATH之前(這對我來說是失敗了)。我相信這是我的模塊不被挑選的原因。

我正確嗎?如果是這樣,有什麼方法來重寫這個(不修改腳本有sys.path.insert(0,path))?

編輯:在回答NicDumz - 原庫是/projects/spam下。 python模塊是/projects/spam/sources/python/a/b/中的一部分。然而,這些是每晚使用本地生成的變體「建造」,然後將它們放入/projects/spam/build/lib/python/a/b/。該腳本僅在最後一個路徑下使用該模塊。
我已經檢出了整個存儲庫下/home/sundar/spam,並在/home/sundar/spam/sources/python/a/b/mymodule.py作出更改。我已將PYTHONPATH設置爲/home/sundar/spam/sources/python,並嘗試登錄import a.b.mymodule,但沒有成功。

+0

我認爲機智會更容易與更長的環境描述。中繼模塊在哪裏安裝?它是如何安裝的?然後,爲了您的副本,您是否只複製一個小的子模塊或整個樹?它放在哪裏? etc ... – NicDumZ 2009-11-05 11:12:20

回答

2

你可以寫一個小的腳本,如下面的一個,即前綴sys.path中,然後設置PYTHONSTARTUP使用該腳本。

import sys 
sys.path.insert(0, 'c:/temp') 

例如...

C:\temp>set PYTHONSTARTUP=c:\temp\tst.py 
C:\temp>C:\Python26\python 
Python 2.6.2 (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)] on 
win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import sys 
>>> sys.path 
['c:/temp', '', 'C:\\Python26\\lib\\site-packages\\setuptools-0.6c9-py2.6.egg', 
'C:\\Python26\\lib\\site-packages\\pyyaml-3.08-py2.6-win32.egg', 'C:\\Python26\\ 
lib\\site-packages\\pyglet-1.1.3-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\ 
simpy-2.0.1-py2.6.egg', 'C:\\Python26\\lib\\site-packages\\nose-0.11.1-py2.6.egg 
', 'C:\\Python26\\lib\\site-packages\\mercurial-unknown-py2.6-win32.egg', 'c:\\t 
emp', 'C:\\WINDOWS\\system32\\python26.zip', 'C:\\Python26\\DLLs', 'C:\\Python26 
\\lib', 'C:\\Python26\\lib\\plat-win', 'C:\\Python26\\lib\\lib-tk', 'C:\\Python2 
6', 'C:\\Python26\\lib\\site-packages', 'C:\\Python26\\lib\\site-packages\\win32 
', 'C:\\Python26\\lib\\site-packages\\win32\\lib', 'C:\\Python26\\lib\\site-pack 
ages\\Pythonwin'] 
+1

不幸的是,當Python解釋器以非交互方式運行時,PYTHONSTARTUP顯然沒有找到。有沒有辦法在交互式解釋器中運行腳本(以及其命令行參數)?如果是這樣,這個解決方案將爲我工作。 – sundar 2009-11-05 20:53:03

2

這聽起來像你需要安裝virtualenv,並用它來設置不同的環境不同的用途。在一個環境中,您可以從存儲庫的主幹導入模塊,但在另一個環境中,您可能會混合使用主幹模塊和測試模塊。

通過藏在心裏單獨這樣你更容易地回滾的變化(只要刪除整個虛擬環境的文件夾),大大降低您您的測試索具將最終被提交到庫中的風險。

+0

但是,這會造成保持兩個環境同步的問題不是嗎?另外,我發現我可以讓virtual-env看不到全局站點包,但這不是我想要的 - 我需要的是讓我的模塊在出現衝突時覆蓋全局模塊,否則會選擇它們。這可能嗎? – sundar 2009-11-06 11:08:46

+0

您不想保持兩個環境同步。您希望一個環境在檢出時運行存儲庫代碼。其他環境將會有一些您正在處理的模塊。完成工作後,您將刪除secong環境。要開始處理一組不同的模塊,請複製存儲庫環境,並開始更改。 在您的工作環境中,您可以安裝所需的任何軟件包和模塊,並編輯它們,並且它們將覆蓋存儲庫中的任何內容。 – 2009-11-06 14:46:26

+0

在任何時候,您都可以讓開發虛擬環境運行未更改的存儲庫代碼,然後返回到開發虛擬環境以測試您自己的代碼更改。完成更改後,只需將它們複製到檢出的存儲庫,再運行一次單元測試並提交它們。 – 2009-11-06 14:48:39

0

您可以使用setuptoolsdistribute創建安裝腳本,然後執行python setup.py develop。它會在.pth文件中添加一個鏈接到您的工作副本,覆蓋任何已安裝的版本。

當你完成,你可以簡單地刪除.pth文件的鏈接。

1

你當前的工作目錄是第一個在sys.path。任何東西都會勝過路上的其他事物。

複製「測試版」有些地方接近目錄列表的前面sys.path,喜歡你的當前工作目錄。

相關問題