次のようにパッケージ化されたプロジェクトがあります。
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')