1

我在我的项目中使用内部导入时遇到了困难。这是我的项目的部分树结构:

app
  |- Gui.py
  |- Main.py
  |- logger.py
  |- config.py
  |- WebParser (package)
        |- __init__.py
        |- LinksGrabber.py
        |- LyricsGrabber.py
        |- ImagesGrabber.py
  |- (Many other packages...)

logger.py和模块在每个包的config.py模块中都是必需的,并且是独立的(仅使用内置模块)。从包内部访问这些模块很棘手。

这就是我尝试实现它的方式,用于启用配置访问和日志记录功能WebParser\LinksGrabber.py

# WebParser\__init__.py:
sys.path.append('..') # for outside-package modules
import config
from logger import log

# WebParser\LinksGrabber.py:
import WebParser
config = WebParser.config
log = WebParser.log

问题:

  • 这有代码气味。我敢打赌有更好的方法来实现这种行为。
  • 我想立即调用import WebParser并使用WebParser.LinksGrabberand WebParser.LyricsGrabber,而不是隐式导入它们。这可以通过导入内部的模块来完成__init__.py,但这是不可能的,因为每个包的模块都会导入包本身,并且会发出递归导入。

您能否提出更好的实现或不同的代码设计?

4

3 回答 3

1

你应该app通过给它一个__init__.py文件来制作一个包。python 相对导入系统仅适用于 packages。然后在您的 WebParser 模块中,您可以执行from .. import config,from .. import Gui等。

至于从其中的包中导入 WebPackage,这有点代码味道。为什么你需要这样做?例如,使用相对导入,您可以from . import LinksGrabber在 ImagesGrabber 等内部访问您需要的内容。如果许多子模块都需要属于 WebParser 包的一部分的函数,则应将它们拉出到 WebParser 中的单独模块中。

于 2012-07-16T18:25:09.810 回答
1

我会将整个外部(app)目录制作成一个 python 包(带有 __ init__.py)。

app_files
  |- ***setup.py***
  |- app
    |- ***__init__.py***
    |- Gui.py
    |- Main.py
    |- logger.py
    |- config.py
    |- WebParser (package)
          |- __init__.py
          |- LinksGrabber.py
          |- LyricsGrabber.py
          |- ImagesGrabber.py
    |- (Many other packages...)

setup.py 会像这样简单:

#!/usr/bin/env python

from distutils.core import setup

setup(name='app',
      version='1.0',
      description='My app',
      author='Greg Ward',
      packages=['app'],
     )

然后你可以运行python setup.py install, 将“app”永久安装到 python 路径中。在我看来,这是最好的方法,而不是到处求助于 sys.path 黑客。

然后,从 python 中的任何地方,您都可以从完整的虚线路径中引用您的任何文件

IE

import app.logger
import app.config
import app.WebParser

使 LinksGrabber 和 LyricsGrabber 仅可从导入 app.WebParser 使用的唯一方法是从 app.WebParser.__ init__ 导入它们。

于 2012-07-16T18:31:36.170 回答
0

看来您可以在这里使用相对导入

from .. import config
from ..logger import log
于 2012-07-16T18:22:48.213 回答