2011-04-14 77 views
6

我正在嘗試爲包含單元測試的Python項目創建一個安裝包。我的項目佈局如下:運行setup.py時子包裝上的ImportError測試

setup.py 
src/ 
    disttest/ 
     __init__.py 
     core.py 
tests/ 
    disttest/ 
     __init__.py 
     testcore.py 

setup.py看起來是這樣的:

from distutils.core import setup 
import setuptools 

setup(name='disttest', 
     version='0.1', 
     package_dir={'': 'src'}, 
     packages=setuptools.find_packages('src'), 
     test_suite='nose.collector', 
     tests_require=['Nose'], 
    ) 

文件tests/disttest/testcore.py包含行from disttest.core import DistTestCore

正在運行setup.py test現在給出ImportError: No module named core

之後setup.py install,python -c "from disttest.core import DistTestCore"工作正常。如果我將import core放入src/disttest/__init__.py,它也可以工作,但我並不想保持這一點,而且它似乎只對測試有必要。

這是爲什麼?那麼解決這個問題的正確方法是什麼?

+1

我想知道:在'setup.py test'之前執行'setup.py install'可能是常見做法嗎? [setuptools文檔](http://peak.telecommunity.com/DevCenter/setuptools#test)聽起來並非如此,我的源代碼應該自動放在'sys.path'中。也許'nose.collector'沒有意識到我的'package_dir'基目錄? – 2011-04-14 12:02:19

+0

你如何在testcore.py中導入核心?什麼是你的sys.path/PYTHONPATH? – Almad 2011-04-16 21:12:48

回答

1

您可能要仔細檢查這一點,但它看起來像你的測試導入在tests/目錄disttest包,而不是從src/目錄包下的測試。

爲什麼您需要使用與被測包相同名稱的包?我只是簡單地將testcore模塊移動到測試目錄,或者重命名tests/disttest包,並避免可能的命名衝突。

在任何情況下,你只想失敗的導入前插入一個import pdb; pdb.set_trace()線和玩不同的import語句,看看有什麼被從那裏進口(import sys; sys.modules['modulename'].__file__是你的朋友),所以你得到一個更好的見識到了什麼是出錯了。

+0

我認爲你的假設是絕對正確的。 'setup.py test'啓動我的測試的方式,可能會在'sys.path'中將'tests/disttest /'放在'src/disttest /'之前,Python永遠不會'合併'具有相同名稱的包。只是將'tests/disttest /'重命名爲'tests/disttest2'(顯然只用於測試目的)修復了這個問題。我將不得不檢查其他項目如何執行此操作,以及最佳做法是什麼,因爲將所有測試模塊放在同一個目錄中對於大型項目來說不是一個選項。感謝您的調試提示! – 2011-04-26 08:48:03

+0

我很茫然,爲什麼'src/disttest/__ init __。py'在'tests/disttest/__ init __。py'之前執行。 (我確認通過向他們添加打印語句。)我會期望它是另一種方式(或可能'src/disttest/__ init __。py''根本不被執行,因爲所有導入只導入'tests/disttest /'),但那只是出於好奇,我現在可以解決我的問題。 – 2011-04-26 08:55:42