2013-02-23 86 views
2

我意識到這可能被認爲是一些在那裏的其他問題重複的問題,但我已經花了一個多小時,現在通過各種網頁和文檔的閱讀,還是不明白,對文件進行操作這裏發生了什麼。Python-在多個目錄

我試圖在多個目錄中使用python文件;我基本上這樣的:

myproject/ 
    __init__.py 
    some_file.py 
    some_data.dat 
    tests/ 
     __init__.py 
     test_some_file.py 

test_some_file.py從從命令行運行,顧名思義,旨在運行包含在some_file.py的代碼,並且需要將其導入。但是,我似乎無法這樣做。

我已經試過:

from myproject import some_file 

from .. import some_file 

我沒有管理,使其運行使用sys.path,但好好嘗試一下似乎是做基於件事的正確方法在我讀過的東西上。

其次,當我確實運行它時,使用sys.path,我得到一個錯誤,它找不到some_data.dat,它被some_file.py使用。

回答

2

這是一個來自Python程序員的長期問題。問題是Python不能很好地處理包內的腳本。在過去的幾個版本中,情況有所改善,但它仍然不會在很多時候做正確的事情。

我認爲最好的答案是限制你在哪裏運行你的test_some_file.py,並使用Python解釋器的-m參數。即更改到myproject之上的目錄,然後運行python -m myproject.tests.test_some_file。這是唯一可以在不影響sys.path的情況下工作的方法。

這將允許您的任何一個導入線路正常工作。 PEP 8目前建議始終使用絕對導入,所以第一個版本可能比使用..的相關版本更好。

+0

這幫助了我的第一個問題;是否有第二個問題的原因,some_file.py不能再找到some_data.dat? – Retsam 2013-02-23 07:05:49

+0

@Retsam:你的模塊有什麼問題? – 2013-02-23 07:40:34

+1

@Retsam:some_file.py可以在os.path.split(__ file __)[0]'目錄中找到some_file.dat。 – martineau 2013-02-23 16:35:31

0

對於像你這樣的情況,我想補充的some_file.py目錄中sys.path(暫時)。

代碼:

import sys, os 
dirname = os.path.dirname(    # going up by 1 directory 
        os.path.dirname(  # going up by 2 directories 
          sys.argv[0])) 
sys.path.append(dirname) 
import some_test