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.LinksGrabberWebParser.LyricsGrabber__init__.py

より良い実装、または別のコード設計を提案できますか?

4

3 に答える 3

1

appファイルを指定してパッケージを作成する必要があり__init__.pyます。Python の相対インポート システムは、パッケージ内でのみ機能します。次に、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して、「アプリ」を python パスに永続的にインストールできます。私の意見では、これはどこでも sys.path ハックに頼らずにそれを行うための最良の方法です。

次に、Python のどこからでも、完全なドット パスから任意のファイルを参照できます。

すなわち

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

インポート app.WebParser から LinksGrabber と LyricsGrabber を利用できるようにする唯一の方法は、app.WebParser.__ init__ からインポートすることです。

于 2012-07-16T18:31:36.170 に答える
0

ここで相対インポートを使用できるようです:

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