2016-08-24 30 views
2

這個問題是由指令在python guide引起的添加項目到SYS路徑在測試中,這似乎不使用工作,除非我誤解的說明如何將包添加到SYS路徑進行測試

我有一個目錄結構,Python項目這樣

sample/a.py 
sample/b.py 
sample/c.py 
sample/__init__.py 
test/context.py 
test/test_something.py 
test/__init__.py 
docs 

the python guide,我應該創建一個測試/ context.py文件,加入

import os 
import sys 
sys.path.insert(0, os.path.abspath('..')) 

import sample 

然後,在我的test/test_something.py文件,它說我能做到這一點

from .context import sample 

資料說「如預期這將始終工作。」

,但是,當我cd到測試和運行

python -m unittest test_something 

我得到一個錯誤

ValueError: Attempted relative import in non-package 

,具體錯誤信息指的是這樣的:from .context import sample

問:我怎麼能將我的示例包正確添加到sys路徑中?

回答時,您是否也可以澄清解決方案是否會處理樣本包中的絕對導入。例如,我的s​​ample.a導入sample.b等。當我測試的結構不同時,我做了絕對導入的sample.a,但由於它的相對導入爲from .b import Boo,它產生了類似的錯誤

更新

`File "/usr/local/lib/python2.7/runpy.py", line 162 in _run_module_as_main "__main__", fname, loader, pkg_name) 
File "/usr/local/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals 
File "/usr/local/lib/python2.7/unittest/__main__.py", line 12, in module main(module=None) 
File "/usr/local/lib/python2.7/unittest/main.py", line 94, in __init__ self.parseArgs(argv) 
File "/usr/local/lib/python2.7/unittest/main.py", line 149 in parseArgs self.createTests() 
File "/usr/local/lib/python2.7/unittest/main.py", line 158, in createTests self.module) 
File "/usr/local/lib/python2.7/unittest/loader.py", line 130, in loadTestsFromNames suites = [self.loadTestsFromName(name,module) for name in names] 
File "/usr/local/lib/python2.7/unittest/loader.py", line 91, in loadTestsFromName module = __import__('-'.join(parts_copy)) 
File "test_something.py", line 8, in module from .context import sample 

更新

,如果我從根目錄運行以下命令

python -m unittest test 

它說, 「在0.000s冉0試驗」

如果如由@cuongnv的意見建議,我從根目錄

python -m unittest test/test_something.py 

或本(沒有文件擴展名)運行該

python -m unittest test/test_something 

它說:「進口的文件名不支持「

+0

Python版本您使用的?很確定相對的進口得到了Python的重做3 –

+0

呃,好的;你可以發佈完整的追溯,然後?和'__init __。py'文件的內容? –

+0

我添加了堆棧跟蹤。謝謝。另外,爲了回答@DarthVader的問題,我使用了python 2,但是我也讓應用程序在python 3上運行,因此我還在示例文件夾中的每個文件的頂部使用'from __future__ import absolute_import' – Leahcim

回答

1

問題:如何將我的樣本包正確添加到sys路徑中?

你這樣做是正確的,但你錯過了宣佈你的文件夾是一個包。嘗試解決基督徒,它應該工作。

您的路徑存儲在sys.path。通過這樣做:

sys.path.insert(0, os.path.abspath('..')) 

你告訴你的Python到上一級文件夾(當前文件)添加到您的路徑。作爲sys.path是一個列表,你可以用列表的其他方法,如insertappend ...

在你的情況,你在路徑列表的頂部插入你的上目錄。

參見:

In [1]: import sys 

In [2]: sys.path 
Out[2]: 
['', 
'/usr/local/bin', 
'/usr/lib/python3.4', 
'/usr/lib/python3.4/plat-x86_64-linux-gnu', 
'/usr/lib/python3.4/lib-dynload', 
'/usr/local/lib/python3.4/dist-packages', 
'/usr/lib/python3/dist-packages', 
'/usr/local/lib/python3.4/dist-packages/IPython/extensions', 
'/home/cuong/.ipython'] 

In [3]: sys.path.insert(0, '/tmp/foo') 

In [4]: sys.path 
Out[4]: 
['/tmp/foo', **<-- on top** 
'', 
'/usr/local/bin', 
'/usr/lib/python3.4', 
'/usr/lib/python3.4/plat-x86_64-linux-gnu', 
'/usr/lib/python3.4/lib-dynload', 
'/usr/local/lib/python3.4/dist-packages', 
'/usr/lib/python3/dist-packages', 
'/usr/local/lib/python3.4/dist-packages/IPython/extensions', 
'/home/cuong/.ipython'] 

所以,從這裏開始,當你有

import sample 

你的Python會嘗試一下路徑,看看是否有任何sample包。

不幸的是,它不能找到sample,因爲你沒有把它作爲一個包,因爲你忘了__init__.pysample文件夾。

希望我的解釋能幫助你理解,你可以處理與此不同的其他情況。

+0

感謝您的解釋,但我有一個__init__.py文件已經在示例和測試文件夾中,我只是忘記在OP中提到。那麼問題是什麼呢? – Leahcim

+0

我想我已經明白了,你並沒有把你的'test'作爲一個包裝。嘗試執行這個命令'cd ..; python -m unittest test.test_something' – cuongnv23

2

嘗試添加一個空的__init__.pytests/touch tests/__init__.py應該這樣做。

+1

實際上,我在'test'文件夾以及'sample'文件夾中有一個__init__.py,它不起作用。我剛剛忘記將其添加到OP中。現在更新。問題是一樣的。 – Leahcim

0

我有一場戰鬥讓我的測試目錄結構在 IDE之外工作。請在下面找到我的解決方案測試在 Windows 7中使用python 3.6和使用Python 3.4 Linux Mint的,使用命令行運行的代碼 :

python -m pytest test_compress_files.py 

我寫信給被測試的文件被稱爲在名爲 \ src目錄compress_files.py 。包含要使用pytest運行的測試的文件在子目錄\ tests中稱爲 test_compress_files.py,因此完整的目錄路徑爲 \ src \ tests。我需要將一個名爲context.py的文件添加到\ src \ tests 目錄中。該文件在test_compress_files.py中用於啓用對上述目錄中的compress_files.py的訪問。 __init__.py文件是空的。

目錄結構

\src 
__init__.py 
compress_files.py 

\src\tests 
__init__.py 
context.py 
test_compress_files.py 

compress_files.py包含腳本來進行測試。

context.py:

import os 
import sys 
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) 

import compress_files 

線:

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__) 

來自在所述掛鉤遠足的建議引導在http://docs.python-guide.org/en/latest/writing/structure/到Python。這會將/ src/tests目錄上方的目錄路徑添加到sys.path,在本例中爲/ src。

test_compress_files.py:

import os 
import pytest 
from .context import compress_files 
from compress_files import * 

# tests start here 
... 
相關問題