首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python包?

Python包?
EN

Stack Overflow用户
提问于 2009-08-27 18:33:29
回答 2查看 3.2K关注 0票数 9

好吧,我认为无论我做错了什么,它可能是非常明显的,但我不能弄清楚。我已经一遍又一遍地阅读了关于包的教程部分,我唯一能想到的是这不会起作用,因为我是直接执行它的。下面是目录设置:

代码语言:javascript
复制
eulerproject/
  __init__.py
  euler1.py
  euler2.py
  ...
  eulern.py
  tests/
    __init__.py
    testeulern.py

以下是testeuler12.py (我编写的第一个测试模块)的内容:

代码语言:javascript
复制
import unittest
from .. import euler12

class Euler12UnitTests(unittest.TestCase):


    def testtriangle(self):
        """
        Ensure that the triangle number generator returns the first 10
        triangle numbers.

        """
        self.seq = [1,3,6,10,15,21,28,36,45,55]
        self.generator = euler12.trianglegenerator()
        self.results = []
        while len(self.results) != 10:
            self.results.append(self.generator.next())
        self.assertEqual(self.seq, self.results)

    def testdivisors(self):
        """
        Ensure that the divisors function can properly factor the number 28.

        """
        self.number = 28
        self.answer = [1,2,4,7,14,28]
        self.assertEqual(self.answer, euler12.divisors(self.number))


if __name__ == '__main__':

    unittest.main()

现在,当我在目录中从IDLE和命令行执行这个命令时,我得到了以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "C:\Documents and Settings\jbennet\My Documents\Python\eulerproject\tests\testeuler12.py", line 2, in <module>
    from .. import euler12
ValueError: Attempted relative import in non-package

我认为问题是因为我直接运行它,我不能做相对导入(因为__name__改变了,我对包描述的模糊理解是__name__是它告诉它在哪个包中的一部分),但在这种情况下,你们有什么建议如何导入存储在测试代码上一层的“生产”代码?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-08-27 19:03:55

通常,您会在PYTHONPATH上的某个位置有一个目录,其名称是您的包名。例如:

代码语言:javascript
复制
eulerproject/
    euler/
        __init__.py
        euler1.py
        ...
        tests/
            ...
    setup.py

然后,您可以在整个系统范围内安装此脚本,或者确保在调用脚本时设置PYTHONPATH=/path/to/eulerproject/:$PYTHONPATH

这样的绝对导入就可以工作了:

代码语言:javascript
复制
from euler import euler1

编辑

根据Python文档,“打算用作Python应用程序的主模块的模块应该始终使用绝对导入。”(Cite)

因此,像另一个答案提到的nose这样的测试工具之所以有效,是因为它导入了包,而不是从命令行运行它们。

如果你想手工操作,你的runnable脚本需要在包层次结构之外,如下所示:

代码语言:javascript
复制
eulerproject/
    runtests.py
    euler/
        __init__.py
        euler1.py
        ...
        tests/
            __init__.py
           testeulern.py

现在,runtests.py可以执行from euler.tests.testeulern import TestCasetesteulern.py可以执行from .. import euler1

票数 8
EN

Stack Overflow用户

发布于 2009-08-27 18:58:49

我也有同样的问题。我现在使用nose运行我的测试,并且正确地处理了相对导入。

是啊,这个相对重要的东西让人迷惑。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1342975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档