1

项目结构如下:

/root
- /crawler
 - /basic
   - agent.py
 - settings.py
 - main.py
- /tests
 - /basic
   - test_agent.py
 - test_main.py

main.py进口agent.pyagent.py进口settings.py。它工作正常,因为我们在main.py下运行/root/crawler,使解释器添加/root/crawler(因为它是main.py生活的地方)到 sys.path,所以当agent.py被导入和解释时,import settings不会引发异常。

但是,当使用nose under运行单元测试时/root,所有其他测试都可以test_agent.py,除了解释器报告它不知道在哪里导入settings

如果我在导入正在测试的模块之前附加/root/crawl到内部路径,它会起作用test_agent.py,但这会被认为是一种不好的做法,对吧?

如果是这样如何避免ImportError

4

1 回答 1

0

如果settings必须是顶级模块,则可以/root/crawlsys.path测试文件中添加。如果您认为它crawl本身可能可以在其他地方导入并像来自另一个程序的库一样使用,那么您应该考虑重组您的包。

你可能想做这样的事情:

/root $ tree
.
├── crawler
│   ├── __init__.py
│   ├── basic
│   │   ├── __init__.py
│   │   └── agent.py
│   └── settings.py
├── main.py
├── test_main.py
└── tests
    ├── __init__.py
    └── crawler
        ├── __init__.py
        └── basic
            ├── __init__.py
            └── test_agent.py

从主要你会做:

from crawler.basic import agent
agent.do_work()

并且从代理您将导入设置,如下所示:

from crawler import settings # or: from .. import settings
print settings.my_setting

test_main.py:

from tests.crawler.basic import test_agent¬
print 'in test_main'

test_agent.py:

from crawler.basic import agent

一切都像它应该的那样工作。诀窍是创建像库一样的文件夹结构,作为一个包,并将您的入口点放入该结构之外的程序并导入包。

您还可以将您的测试目录移动到爬虫目录中,然后运行crawler.tests.basic.test_agent​​.

于 2013-11-08T13:08:32.657 回答