2016-03-23 4 views
3

я работаю на пакете P с Setuptools и pkg_resources, , где пакет, после установки, необходимо загрузить некоторые файлы и поместить их в отдельной директории (P/bin/).Как получить каталог установки с помощью Setuptools и pkg_ressources

Я пытаюсь использовать 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 
    }, 
) 

Есть стандартный способ получить каталог установки во время установки, кросс-платформенный и совместимый питона 2 и 3? Если нет, что мне делать?

ответ

1

Обходным решением является использование пакета site вместо pkg_resources, который, как представляется, не предназначен для доступа к ресурсам во время установки.

Вот функция, которая обнаруживает каталог установки во время установки:

import os, sys, site 

def binaries_directory(): 
    """Return the installation directory, or None""" 
    if '--user' in sys.argv: 
     paths = (site.getusersitepackages(),) 
    else: 
     py_version = '%s.%s' % (sys.version_info[0], sys.version_info[1]) 
     paths = (s % (py_version) for s in (
      sys.prefix + '/lib/python%s/dist-packages/', 
      sys.prefix + '/lib/python%s/site-packages/', 
      sys.prefix + '/local/lib/python%s/dist-packages/', 
      sys.prefix + '/local/lib/python%s/site-packages/', 
      '/Library/Python/%s/site-packages/', 
     )) 

    for path in paths: 
     if os.path.exists(path): 
      return path 
    print('no installation path found', file=sys.stderr) 
    return None 

Это решение не является Python 2.7 совместимы, в случае установки с использованием virtualenv, из-за known bug о модуле site. (см. соответствующий SO)