Я пытаюсь включить файлы данных в 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).