2015-12-30 77 views
1

我意識到在StackOverflow已經有很多關於這個的問題,但我發現解決方案完全不清楚,並且經常相互矛盾。Python3在包內的相對導入

我有以下情形:我正在寫一個Python(Python的3.4)封裝結構如下:

mypackage/ 
    __init__.py (empty file) 
    mydir1/ 
     __init__.py (empty file) 
     mymodule1.py 
    mydir2/ 
     __init__.py (empty file) 
     mymodule21.py 
     mymodule22.py 
    mydir3/ 
     __init__.py (empty file) 
     mymodule31.py 
     mymodule32.py 
    tests/ 
     __init__.py (empty file) 
     test_something_in_mydir1.py 
     test_something_in_mydir2.py 
     test_something_in_mydir3.py 

我想tests/目錄中的文件包含在包裝內的一切的單元測試。問題是,不管哪一種方法我試試,我得到這個錯誤:

SystemError: Parent module '' not loaded, cannot perform relative import

我要指出,我想這個工作「開箱即用」,這意味着我不希望導入的東西使用他們的絕對路徑,我不想改變我的路徑變量。這些解決方案似乎都不是什麼pythonic,它讓我慢慢地爬上了牆。是否真的沒有辦法做到這一點?

我已經嘗試了一堆東西已經包括下面的例子,但他們似乎都產生相同的結果:

from ..mydir1.mymodule1 import * 
from .mypackage.mydir1.mymodule1 import * 
from ...mypackage.mydir1.mymodule1 import * 

我累了,在每個__init__.py文件覆蓋__all__變量以及進口如下所示:https://docs.python.org/3/reference/import.html#submodules

任何人都可以告訴我如何在文件test_something_in_mydir1.py中構造導入(例如),以便有權訪問所有找到的類/函數用於單元測試包的mymodule1.py?

回答

1

如果test_something_in_mydir1.py包含:

import unittest 
from ..mydir1 import mymodule1 

class Test1(unittest.TestCase): 
    def test1(self): 
     self.assertEqual(mymodule1.x,1) # mymodule1 trivially contains x=1 

而且,如果單元測試從使用下面的命令含有的包(在此情況下,C:\Test)目錄推出:

py -m unittest discover -v 

的測試被發現並且在相對進口下正確運行:

C:\Test>tree /f 
Folder PATH listing 
Volume serial number is CE8B-D448 
C:. 
└───mypackage 
    │ __init__.py 
    │ 
    ├───mydir1 
    │  mymodule1.py 
    │  __init__.py 
    │ 
    ├───mydir2 
    │  mymodule21.py 
    │  mymodule22.py 
    │  __init__.py 
    │ 
    ├───mydir3 
    │  mymodule31.py 
    │  mymodule32.py 
    │  __init__.py 
    │ 
    └───tests 
      test_something_in_mydir1.py 
      __init__.py 


C:\Test>py -m unittest discover -v 
test1 (mypackage.tests.test_something_in_mydir1.Test1) ... ok 

---------------------------------------------------------------------- 
Ran 1 test in 0.000s 

OK 
+0

沒關係,我有一個命名錯誤,所以現在它發現了測試並嘗試運行它,但儘管使用了相對導入'from ..mydir1.mymodule1 import *'它仍然給我錯誤SystemError:父模塊''沒有加載,不能執行相對導入' – RedHack

+0

我也試過'從..mydir1導入mymodule1',那也沒有工作,產生相同的錯誤。 – RedHack

+0

我確信在我的具體情況下它不是什麼愚蠢的東西,甚至重新創建了與我在這裏使用的佔位符相同的標題的目錄,並確實發生了同樣的問題。我創建了一個pastebin,以防萬一它能幫助我查看我使用的精確命令以及我得到的錯誤(http://pastebin.com/08mutDrY) – RedHack