123

我正在尝试组织一些模块供我自己使用。我有这样的事情:

lib/
  __init__.py
  settings.py
  foo/
    __init__.py
    someobject.py
  bar/
    __init__.py
    somethingelse.py

lib/__init__.py中,我想定义一些在导入 lib 时要使用的类。但是,如果不将类分成文件并将它们导入__init__.py.

而不是说:

    lib/
      __init__.py
      settings.py
      helperclass.py
      foo/
        __init__.py
        someobject.py
      bar/
        __init__.py
        somethingelse.py

from lib.settings import Values
from lib.helperclass import Helper

我想要这样的东西:

    lib/
      __init__.py  #Helper defined in this file
      settings.py
      foo/
        __init__.py
        someobject.py
      bar/
        __init__.py
        somethingelse.py

from lib.settings import Values
from lib import Helper

有可能,还是我必须将类分成另一个文件?

编辑

好的,如果我从另一个脚本导入 lib,我可以访问 Helper 类。如何从 settings.py 访问 Helper 类?

此处的示例描述了包内引用。我引用“子模块经常需要相互引用”。就我而言,lib.settings.py 需要 Helper,而 lib.foo.someobject 需要访问 Helper,那么我应该在哪里定义 Helper 类?

4

7 回答 7

93
  1. 'lib/的父目录必须在sys.path.

  2. 您的 ' lib/__init__.py' 可能如下所示:

    from . import settings # or just 'import settings' on old Python versions
    class Helper(object):
          pass
    

那么下面的例子应该可以工作:

from lib.settings import Values
from lib import Helper

回答问题的编辑版本:

__init__.py定义您的包裹从外部看起来如何。如果您需要使用Helperinsettings.py然后Helper在不同的文件中定义,例如,' lib/helper.py'。

.
| `-- import_submodule.py
    `--库
    |-- __init__.py
    |-- 富
    | |-- __init__.py
    | `--someobject.py
    |-- 助手.py
    `-- 设置.py

2个目录,6个文件

命令:

$ python import_submodule.py

输出:

settings
helper
Helper in lib.settings
someobject
Helper in lib.foo.someobject

# ./import_submodule.py
import fnmatch, os
from lib.settings import Values
from lib import Helper

print
for root, dirs, files in os.walk('.'):
    for f in fnmatch.filter(files, '*.py'):
        print "# %s/%s" % (os.path.basename(root), f)
        print open(os.path.join(root, f)).read()
        print


# lib/helper.py
print 'helper'
class Helper(object):
    def __init__(self, module_name):
        print "Helper in", module_name


# lib/settings.py
print "settings"
import helper

class Values(object):
    pass

helper.Helper(__name__)


# lib/__init__.py
#from __future__ import absolute_import
import settings, foo.someobject, helper

Helper = helper.Helper


# foo/someobject.py
print "someobject"
from .. import helper

helper.Helper(__name__)


# foo/__init__.py
import someobject
于 2009-02-24T18:52:35.090 回答
25

如果lib/__init__.py定义了 Helper 类,那么在 settings.py 中你可以使用:

from . import Helper

这有效,因为 . 是当前目录,从设置模块的角度来看,它是 lib 包的同义词。请注意,不必通过 导出 Helper __all__

(用 python 2.7.10 确认,在 Windows 上运行。)

于 2015-06-30T14:27:43.993 回答
8

您只需将它们放在 __init__.py 中。

所以 test/classes.py 是:

class A(object): pass
class B(object): pass

...和 ​​test/__init__.py 是:

from classes import *

class Helper(object): pass

您可以导入测试并访问 A、B 和 Helper

>>> import test
>>> test.A
<class 'test.classes.A'>
>>> test.B
<class 'test.classes.B'>
>>> test.Helper
<class 'test.Helper'>
于 2009-02-24T17:42:59.033 回答
5

添加这样的东西lib/__init__.py

from .helperclass import Helper

现在您可以直接导入它:

from lib import Helper

于 2014-06-03T09:39:20.687 回答
4

编辑,因为我误解了这个问题:

只需将Helper课程放入__init__.py. 那是完美的pythonic。来自 Java 等语言的感觉很奇怪。

于 2009-02-24T17:42:24.900 回答
2

是的,有可能。您可能还想__all____init__.py文件中定义。这是您执行时将要导入的模块列表

from lib import *
于 2009-02-24T17:49:28.830 回答
-7

也许这可以工作:

import __init__ as lib
于 2011-01-04T15:09:22.667 回答