【问题标题】:How to organize project structure of python?如何组织python的项目结构?
【发布时间】:2017-08-02 09:29:48
【问题描述】:

例如,我有一个名为myproject 的项目。在myproject 目录中。有other 子目录和main.py。而在other子目录下,有a.pyb.py

a.py中的内容是

import b

main.py中的内容是:

from other.a import *

这里有一个问题,在main.py中,当我使用from other.a import *时,a.py的内容包含在main.py中,会报错,因为b.pyother中,所以在main.py中使用import b是错误的,我们应该使用import other.b,但是a.py需要import b,所以是矛盾的。我该如何解决?

【问题讨论】:

  • @MartinAlonso 您链接的问题与此问题非常不同。
  • 你不应该在包中使用相对导入。在 Python 3 中,它们不起作用,而在 Python 2 中,它们已被弃用。所以在a.py你需要做from . import bimport other.b
  • 并且不要与sys.path 混淆,正如另一个问题中所建议的那样。它有时对测试和特殊情况很有帮助,但一般来说,最好将 sys.path 的管理留给分发实用程序。
  • @Gauss 如果a.py 是包的一部分,它不能直接运行。这是故意的。包中的模块应该提供函数和类供程序的其他部分使用,但它们在导入时不应该有副作用。在某些情况下,使模块可直接运行很有用,但您需要使用python -m other.a 运行它。但是,这是针对特殊情况的高级方法。

标签: python python-3.x


【解决方案1】:

我认为这是您的代码结构,对吗?

mypackage
    other
        __init__.py
        a.py # import b
        b.py # def func_b()
    __init__.py
    main.py # from other.a import *

你可以使用这个代码结构:

不要在您的可安装包中使用绝对导入,例如:main.py 中的from mypackage.other import b,使用相对导入,例如:main.py 中的from .other import b

mypackage
    other
        __init__.py
        a.py # from . import b
        b.py
    __init__.py
    main.py # from .other.a import *

然后你可以在 main.py 中这样做:

b.func_b(...)

因为这样做,当你有一个脚本test.py

from mypackage import main

main.b.func_b()

它的基础是from .other.a import *,因为您在a.py 中有from . import b。所以*实际上是b,这就是为什么你可以使用b.func_b()in main.py

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 2017-08-18
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多