Python distutils и замена строк в коде - PullRequest
2 голосов
/ 06 ноября 2008

Мне часто приходится вводить пути в мой код, чтобы найти данные или, в некоторых случаях, специфичные для инструмента модули. До сих пор я всегда использовал autotools из-за этого - просто вызвать sed, чтобы заменить несколько строк во время сборки. Тем не менее, я хотел бы найти более Pythonic способ сделать это, то есть использовать distutils или какой-то другой благословенный способ сборки / установки. Мне никогда не удавалось найти что-либо связанное с этим в документации distutils, но как другие люди решают эту проблему?

Ответы [ 5 ]

1 голос
/ 08 декабря 2008

В настоящее время лучший способ связать данные с кодом - это setuptools и использование pkg_resources:

from pkg_resources import resource_filename, resource_stream
stream = resource_stream("PACKAGE", "path/to/data_f.ile")

Преимущество также в работе с яйцами Python. У него (IMHO) есть недостаток, заключающийся в том, что вам нужно поместить файлы данных в каталог кода, что является общепринятой практикой (одна из очень, очень немногих, с которыми я не согласен).

Что касается дистрибутивов Linux, я могу (разумно) заверить вас, что ваша программа будет работать без проблем (и исправлений) в любой современной системе, основанной на Debian, если вы используете pkg_resources. Я не знаю о Fedora / openSUSE, но я бы предположил, что он работает также.

Он работает в Windows, но в настоящее время не работает с py2exe - однако для этого есть простые обходные пути.

1 голос
/ 06 ноября 2008

Ну, с distutils (в стандартной библиотеке) у вас есть "данные пакета". Это данные, которые живут внутри самого пакета. Здесь объясняется, как это сделать. Это явно не идеально, так как вам придется использовать какие-то __file__ хаки для поиска расположения данных во время выполнения.

Итак, пришло время setuptools (не в стандартной библиотеке), который дополнительно имеет способы поиска местоположения этих данных во время выполнения. Объяснил здесь, как это сделать . Но опять же, у него есть свои проблемы, например, могут возникнуть проблемы с поиском файлов данных в неустановленном необработанном пакете.

Существуют также дополнительные сторонние инструменты. Я использовал kiwi.environ . Он предлагает каталоги данных и поиск во время выполнения, но я бы не рекомендовал его для общего использования, поскольку он ориентирован на разработку PyGTK и местоположение файла Glade.

Я бы предположил, что есть другие сторонние инструменты, и другие будут уточнять.

1 голос
/ 06 ноября 2008

Для путей к модулям обычной практикой является размещение их в .pth файлах, как указано здесь . Модуль site предоставляет пространство для ловушек конфигурации сайта, которые вы можете использовать для адаптации вашей среды.

0 голосов
/ 08 декабря 2008

ОП здесь, мне не удалось войти в систему, используя мой OpenID.

@S.Lott

Точка хорошо принята, но для некоторых дистрибутивов Linux кажется стандартным устанавливать специфичные для приложения данные и специфичные для приложения модули в определенных местах. Я думаю, что сделать эти места настраиваемыми во время сборки / установки - хорошая вещь для людей, упаковывающих мое приложение. AFAICS «питонический путь» в этом случае заставит этих упаковщиков применять патчи к моему коду.

У меня также есть привычка писать приложения, где исполняемая часть представляет собой крошечную обертку вокруг основной функции в модуле, специфичном для приложения. Мне кажется неправильным вставлять этот модуль для конкретного приложения в /usr/lib/python2.5/site-packages.

0 голосов
/ 06 ноября 2008

«Я часто нахожу необходимость указывать пути в своем коде» - для начала это не очень Pythonic.

В идеале, ваш код живет в каком-то месте, например, пакетах сайтов, и на этом все.

Часто у нас есть установленное «приложение», которое использует довольно фиксированный набор каталогов для рабочих файлов. В Linux мы получаем эту информацию из переменных среды и файлов конфигурации, принадлежащих конкретному идентификатору пользователя, в котором выполняется приложение.

Я не думаю, что вы должны указывать пути в своем коде. Я думаю, что есть лучший способ.

[Я только что написал наш инструмент установки приложения, который создает все файлы конфигурации для довольно сложного приложения. Я использовал инструмент шаблонов Mako для генерации всех четырех файлов из шаблонов.]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...