P
setuptools と pkg_resources を含むパッケージに取り組んでいます。このパッケージでは、インストール後にいくつかのバイナリをダウンロードして、専用のディレクトリ ( P/bin/
) に配置する必要があります。
pkg_ressources.resource_filename
絶対ディレクトリパスを取得するために使用しようとしています。(virtualenv を使用するため)
を使用したインストール中python setup.py install
に、pkg_ressources.resource_filename は のようなパスを返しません/home/user/tests/venv/lib/python3.4/site-package/P/bin/
が、実際のモジュールへのパスを返します/home/user/projects/P/P/bin/
。
個人的なプロジェクト ディレクトリ (モジュールを開発する場所) ではなく、インストール ディレクトリ (virtualenv 内) が必要なため、これは問題です。
を使用して pypi を通過しようとすると、pip install module
によって返されるディレクトリはpkg_ressources.resource_filename
のような一時ファイル/tmp/pip-build-xxxxxxx/P/bin/
であり、バイナリを配置する場所ではありません。
これが私のsetup.pyです:
from setuptools import setup
import os
from setuptools.command.install import install as _install
from pkg_resources import resource_filename
def post_install():
"""Get the binaries online, and give them the execution permission"""
package_dir_bin = resource_filename('P', 'bin') # should be /home/user/tests/venv/lib/python3.4/site-package/P/bin/
# package_dir_bin = resource_filename(Requirement.parse('P'), 'bin') # leads to same results
put_binaries_in(package_dir_bin)
os.system('chmod +x ' + package_dir_bin + '*')
class install(_install):
# see http://stackoverflow.com/a/18159969
def run(self):
"""Call superclass run method, then downloads the binaries"""
_install.run(self)
self.execute(post_install, args=[], msg=post_install.__doc__)
setup(
cmdclass={'install': install},
name = 'P',
# many metadata
package_dir = { 'P' : 'P'},
package_data = {
'P' : ['bin/*.txt'] # there is an empty txt file in bin directory
},
)
インストール、クロスプラットフォーム、および互換性のある python 2 および 3 中にインストールディレクトリを取得する標準的な方法はありますか? そうでない場合は、どうすればよいですか?