4

数時間後、アプリケーションのバグの原因を発見しました。私のアプリのソースは次のように構成されています。

main/
    __init__.py
    folderA/
        __init__.py
        fileA.py
        fileB.py

実際には、あと 50 個ほどのファイルがあります。しかし、それは重要ではありません。にはmain/__init__.py、次のコードがあります。from folderA.fileA import *

folderA/__init__.py私はこのコードを持っています:

sys.path.append(pathToFolderA)

folderA/fileB.py私はこのコードを持っています:

from fileA import *

問題は、fileA が 2 回インポートされることです。ただし、一度だけインポートしたいです。

これを修正する明白な方法 (少なくとも私にとって) は、特定のパスを から に変更することですpathfolderA.path

しかし、そもそもPythonでこのエラーが発生するべきではないと思います。各ファイルが絶対的な場所を知る必要がない他の回避策はありますか?

4

2 に答える 2

5

このように sys.path を変更しないでください。モジュールにアクセスするための 2 つの方法 (名前) が提供されるため、問題が発生します。

代わりに、絶対または明確な相対インポートを使用してください。(あいまいな相対インポートは、古い Python バージョンの最後の手段として使用できます。)

フォルダA/ファイルB.py

from main.folderA.fileA import *   # absolute
from .fileA import *               # unambiguous-relative
from fileA import *                # ambiguous-relative

もちろん、その星の代わりに特定の名前を使用する必要があります。

于 2010-03-22T01:57:48.113 に答える
5
  • 変更sys.pathは、実際のプログラムで行うことではありません。PYTHONPATH を永続的に設定したり、モジュールを Python が見つけられる場所に配置したりするよりも、モジュール性と移植性が損なわれます。

  • これまでに使用したことはありませんimport *。名前空間が汚染され、コードが予測不能になります。

  • folderA on は必要ありませんsys.path。これは のサブパッケージでmainあり、常にそのように扱う必要があります。最上位パッケージへの絶対インポートを常に使用しimport main.folderAますimport folderA。これにより、コードの追跡、移動、インストールがはるかに簡単になります。

于 2010-03-22T01:58:06.397 に答える