Определение местоположения файлов данных distutils программно в Python

Я пытаюсь включить файлы данных в distutils для моего пакета и затем ссылаться на них, используя относительные пути (следуя http://docs.python.org/distutils/setupscript.html#distutils-additional-files)

Моя структура dir такова:

myproject/
  mycode.py
  data/
    file1.dat

код в mycode.py, который на самом деле является скриптом в пакете. Он полагается на доступ к data/file1.dat, обратитесь к нему, используя этот относительный путь. В setup.py у меня есть:

setup(
 ...
 scripts = "myproject/mycode.py"
 data_files = [('data', 'myproject/data/file1.dat')]
)

Предположим, что пользователь теперь использует:

python setup.py --prefix=/home/user/

Тогда mycode.py появится в каком-нибудь месте вроде /home/user/bin/. Но ссылка на data/file1.dat теперь нарушена, поскольку скрипт живет в другом месте от данных.

Как я могу узнать из mycode.py абсолютный путь к myproject/data/file1.dat, чтобы я мог правильно ссылаться на него в зависимости от того, где пользователь установил пакет?

EDIT
Когда я устанавливаю это с prefix=/home/user/, я получаю data/file1. dat, созданный в /home/user/, что именно то, что я хочу, единственная недостающая часть - как получить абсолютный путь к этому файлу программно, учитывая только относительный путь и не зная, где пользователь установил пакет. Когда я пытаюсь использовать package_data вместо data_files, это не работает - у меня просто нигде не создается data/file1.dat, даже если я удалю свой файл MANIFEST.

Я прочитал все текущие обсуждения этой, по-видимому, очень распространенной проблемы. Однако все предлагаемые решения не имеют отношения к случаю, который я описал выше, когда код, которому нужно получить доступ к data_files, является скриптом, и его местоположение может меняться в зависимости от --prefix аргумента в setup.py. Единственный хак, который я могу придумать для решения этой проблемы, это добавить файл данных в scripts= в setup(), как в:

setup(
  ...
  scripts = ["myproject/mycode.py", "myproject/data/file1.data"]
)

это ужасный хак, но это единственный способ, который я могу придумать, чтобы гарантировать, что file1. data будет находиться в том же месте, что и скрипты, определенные в scripts=, поскольку я не могу найти никакого независимого от платформы и чувствительного к установке API для восстановления расположения data_files после того, как пользователь выполнил setup.py install (потенциально с --prefix= args).

12
задан Piotr Dobrogost 20 October 2012 в 10:17
поделиться