2017-11-23 33 views
1

インストール時にユーザのホームディレクトリにコピーしたい設定ファイルが付属しているPythonプロジェクトをパッケージ化しようとしています。パッケージングのクイックガイドには、setuptools.setupへの引数data_filesを使用してこれを行うことができます。だから、これは私が持っているものです。インストール時に設定ファイルをコピーする

data_files = [(os.path.expanduser("~"), [".my_config"])] 

これは私がpython setup.py installを使用している場合、正常に動作するように見えるが、私は私のは、PyPIにパッケージをアップロードして、ドットファイルがコピーされていないpip installを実行したとき。

FWIW、私はドットファイルをMANIFEST.inに入れて、package_data引数をsetupに含めようとしました。これらのステップのどれもが違いを生むようには見えません。私がpip installで、site-packagesディレクトリの周りを撫でると、ソースファイルだけがここにあります。

私は何をお探しですか?

答えて

1

これは私が一度経験した問題です。その根幹は、ホイールファイルを構築するときに、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() 
+0

ありがとうございました:私は、スクリプトにチェックロジックを追加すると、 pip'はアップグレード時に間違ったことを行い、既存のドットファイルを静かに上書きします。 – Xophmeister

関連する問題