これは私が一度経験した問題です。その根幹は、ホイールファイルを構築するときに、data_files
で指定された絶対パスはすべて、ターゲットsite-packages
ディレクトリに相対化されます(this issue on githubを参照)。これは、任意のソースパッケージ(.tar.gz
、.tar.bz2
または.zip
)のうち、ホイールを構築し、その結果、車輪がインストールされますようpip install
によって実行されるインストールに影響を与える:
インストールされたファイルの利回りチェック
$ pip install spam-0.1.tar.gz
Processing ./spam-0.1.tar.gz
Building wheels for collected packages: spam Running setup.py bdist_wheel for spam ... done
Stored in directory: /Users/hoefling/Library/Caches/pip/wheels/d0/95/be/bc79f1d589d90d67139481a3e706bcc54578fdbf891aef75c0
Successfully built spam
Installing collected packages: spam
Successfully installed spam-0.1
:
$ pip show -f spam
Name: spam
Version: 0.1
...
Location: /Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages
Requires:
Files:
Users/hoefling/.my_config
spam-0.1.dist-info/DESCRIPTION.rst
spam-0.1.dist-info/INSTALLER
spam-0.1.dist-info/METADATA
spam-0.1.dist-info/RECORD
spam-0.1.dist-info/WHEEL
spam-0.1.dist-info/metadata.json
spam-0.1.dist-info/top_level.txt
注意を絶対パスであることを意味するパスは、Location
ディレクトリとの相対パスです。この例では、.my_config
は/Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages/Users/hoefling/.my_config
の下に置かれます。
これらのホイールがディスクにキャッシュされているので、次回パッケージを再インストールするときに組み立てたホイールがまだpip
のキャッシュに残っているため、インストールに使用され、ターミナルログにホイールを作成することについての記述を参照してください。
これを回避する実際の解決策はありません。ファイルが正しく配置され
$ pip install spam-0.1.tar.gz --no-binary=spam
Processing ./spam-0.1.tar.gz
Skipping bdist_wheel for spam, due to binaries being disabled for it.
Installing collected packages: spam
Running setup.py install for spam ... done
Successfully installed spam-0.1
:
$ pip show -f spam
Name: spam
Version: 0.1
...
Location: /Users/hoefling/.virtualenvs/stackoverflow/lib/python3.6/site-packages
Requires:
Files:
../../../../../.my_config
spam-0.1-py3.6.egg-info/PKG-INFO
spam-0.1-py3.6.egg-info/SOURCES.txt
spam-0.1-py3.6.egg-info/dependency_links.txt
spam-0.1-py3.6.egg-info/top_level.txt
残念ながら、ユーザー私が見つけた最もまともな回避策は、インストール時にパッケージのsetup.py
の実行を強制するインストール時に「バイナリ」パッケージを禁止することですパッケージメタデータのホイールを作成することを禁止する可能性がないので、別のキー(readme、Webpage FAQなどを使用)を使用してpip install
を呼び出すことについて別途通知する必要があります。
この結果、絶対パスのファイルは含まれなくなりました。代わりに、pythonソースをsite-packages
ディレクトリにインストールします。 Pythonコードでは、必要に応じて、存在チェックとファイルコピーのロジックを追加する必要があります。
# program entrypoint
if __name__ == '__main__':
config = os.path.join(os.path.expanduser('~'), '.my_config')
if not os.path.exists(config):
shutil.copyfile('.my_config', config)
main.run()
ありがとうございました:私は、スクリプトにチェックロジックを追加すると、 pip'はアップグレード時に間違ったことを行い、既存のドットファイルを静かに上書きします。 – Xophmeister