2013-12-19 122 views
8

我一直在尋找解決這個問題的方法。Python導入模塊,文件夾結構

我有一個Python項目,這是該文件夾結構我想:

/project/main.py 
/project/src/models.py 
/project/test/tests.py 

我希望能夠在終端執行tests.py運行測試。 tests.py在/ project/src /中導入模塊以進行測試。首先,我通過在tests.py中添加 sys.path.insert(0, '..')來解決這個問題。但是然後models.py用於打開文本文件的路徑必須與tests.py等相關。這意味着程序在執行main.py時不會運行,路徑的原因。

我也試過當導入模塊到tests.py,如from ..src.models import *,但給出了錯誤消息說:「嘗試相對導入非包」。

我應該把什麼放在tests.py的頂部,以便能夠從models.py導入模塊?

+0

你使用的是什麼版本的Python? – jpmc26

+0

Python版本2.7.5 – user1121487

回答

3

您使用的結構不是我會推薦的結構,但我是Python項目通常結構化的比較新手。我相信這會做你以後:

1)將一個__init__.py文件中/project/project/src,並/project/test以確保他們當作包。

2)將from __future__ import absolute_import放在每個Python文件的頂部。

3)然後使用相對進口:

test.py

from ..src import models 

main.py

from .src import models 

4)你需要以不同的方式啓動應用程序。確保您的當前目錄是/project父(這似乎是文件系統的根目錄)並運行你的項目是這樣的:

python -m project.main 

對於我自己的項目,我一定會把main.pysrc,如果它是起點的應用程序。我也許會把tests.py也放在src之內,但如果不是的話,我會在命令行而不是代碼中將/project/src添加到測試運行器的Python路徑中。

無論如何我仍然會使用absolute_import。根據我的經驗,這是一個非常乾淨的解決方案,模塊組織,這也是事物如何在默認情況下在Python工作3

+0

我仍然得到這個:ValueError:嘗試在非包中的相對導入。我現在到處都是__init__.py。 – user1121487

+0

@ user1121487是的。剛剛意識到這一點抱歉。我的編輯應該解決它,如果你沒有弄清楚。 – jpmc26

+0

它仍然給出相同的錯誤信息。 – user1121487

0

首先把在src目錄中main.py ..

在測試中

你可以做,sys.path。追加(「src目錄」)

,如果你想從那裏您正在執行的應用程序,我建議你添加

import os 
os.chdir('relative path to the src dir') 

thisway你的程序將在運行強制執行是在特定的目錄,無論你所指定的目錄,所以它會尊重你在你的代碼中的相對路徑