「-e」なしでサイトパッケージにインストールすると、別の Python ライブラリによってインストールされたデータ ファイルの検索が機能しない

okwaves2024-01-25  7

次のようにパッケージ化されたプロジェクトがあります。

wcnlp-tools (project root)
  
 nlu-spacy
   setup.py
   ... 
   spacy(package name)
    ...

 nlu-wcnlp
   setup.py
   ... 
   wcnlp (package name)
     ...
     

wcnlp はスペースに依存します。

使用する場合:

pip install -e .

両方のライブラリをインストールしても、すべて問題なく動作します。ただし、-e を使用して両方をインストールしないと、エラーが再度表示されます。

pip install .

このエラーの原因となった行は次のとおりです。

abspath = os.path.abspath(os.path.dirname(__file__))
read_yaml_file('os.path.join(abspath,"../../../../nlu-wcnlp/wcnlp/configs/spacy_config.yml")')

エラーメッセージは次のとおりです:

No such file or directory: '/Users/minmin/nlp/test/wcnlp-tools/ven/lib/python3.7/site-packages/spacy/lang/en/../../../../nlu-wcnlp/wcnlp/configs/spacy_config.yml'

正しく解決された場合、実際のパスは次のようになります。

/Users/minmin/nlp/test/wcnlp-tools/ven/lib/python3.7/site-packages/spacy/lang/en/../../../../site-packages/wcnlp/configs/spacy_config.yml

両者の違いは次のとおりです。

    site-packages

VS
    nlu-wcnlp

考えられる理由は何ですか?ファイルパスコードを変更するか、スクリプトをセットアップする必要がありますか? 「pip install -e」に注意してください。全て正常に動作します。

追加: エラーは nlu-wcnlp から発生しますが、エラーを含むプロジェクト nlu-spacy まで追跡されます。

エラー トレース:

File "/Users/minmin/nlp/test/wcnlp-tools/ven/lib/python3.7/site-packages/wcnlp/nlp_utils.py", line 4, in <module>
    from spacy.lang.en.stop_words import STOP_WORDS
  File "/Users/minmin/nlp/test/wcnlp-tools/ven/lib/python3.7/site-packages/spacy/lang/en/__init__.py", line 32, in <module>
    CONFIG = read_yaml_file(SPACY_CONFIG_FILE)
  File "/Users/minmin/nlp/test/wcnlp-tools/ven/lib/python3.7/site-packages/wcnlp/utils/fileio.py", line 10, in read_yaml_file
    with open(filename) as stream:
FileNotFoundError: [Errno 2] No such file or directory: '/Users/minmin/nlp/test/wcnlp-tools/ven/lib/python3.7/site-packages/spacy/lang/en/../../../../wcnlp-tools/wcnlp/configs/spacy_config.yml

どのプロジェクトにエラーの原因となる行が含まれているか。プロジェクトのルートから見てどのファイルにあるのでしょうか? (いずれにせよ、そのパスのスタイルはコードの匂いが非常に強いです)。

– チャールズ・ダフィー

2020 年 9 月 4 日 20:05

...同じプロジェクトにパッケージ化されたものを見つけたいコードは、独自の __file__ を使用する必要がありますが、別のプロジェクト内にパッケージ化されたものを見つけたい場合は、検索する相対的な場所として otherproject.__file__ を使用する必要があります。いいえ.../.../.../面白い仕事だ。

– チャールズ・ダフィー

2020 年 9 月 4 日 20:06

@CharlesDuffy: エラーは nlu-wcnlp から発生していますが、エラーを含むプロジェクト nlu-spacy まで追跡されます。

– マロン

2020 年 9 月 4 日 20:08

もう 1 つは、コンテンツが別のファイルとしてインストールされるようにするには、setup.py にフラグを設定する必要があることです。

– チャールズ・ダフィー

2020 年 9 月 4 日 20:08

Re: 最後のコメント -- 明確にするのに十分な詳細を追加して質問を修正してください (スタック トレース、おそらく?)

– チャールズ・ダフィー

2020 年 9 月 4 日 20:09



------------------------

__file__ を使用してパッケージに関連付けられたデータ ファイルを検索する場合は、データ ファイルを提供するパッケージに関連付けられたモジュールの __file__ 属性に相対的なパッケージを常に使用する必要があります。 2 つのパッケージ間のスペースにまたがる相対パスを使用しないでください。そのため、これらのパッケージが互いの相対的などこにインストールされるかを正確に予測できると想定されます。

したがって、これは信頼性がありません (インストール場所についての仮定があり、それが維持されることが保証されていません)。

SPACEY_CONFIG_FILE = os.path.join(os.path.dirname(__file__), 
                              '/../../../../site-packages/wcnlp/configs/spacy_config.yml'

...しかし、これは問題ありません:

import wcnlp
SPACEY_CONFIG_FILE = os.path.join(os.path.dirname(wcnlp.__file__),
                                  'configs/spacy_config.yml')

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。