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






Пути к модулям обычно помещаются в файлы .pth как задокументировано здесь. Модуль сайт предоставляет место для перехватчиков конфигурации для конкретного сайта, вы можете использовать его для настройки своей среды.
Что ж, с distutils (в стандартной библиотеке) у вас есть "данные пакета". Это данные, которые живут внутри самого пакета. Здесь объяснили, как это сделать. Это явно не идеально, так как вам придется использовать какие-то хаки __file__ для поиска местоположения данных во время выполнения.
Затем идет setuptools (не в стандартной библиотеке), в котором дополнительно есть способы поиска местоположения этих данных во время выполнения. Здесь объяснили, как это сделать. Но опять же, у него есть собственный набор проблем, например, у него могут возникнуть проблемы с поиском файлов данных в неустановленном необработанном пакете.
Есть также дополнительные сторонние инструменты. Я использовал kiwi.environ. Он предлагает каталоги данных и поиск во время выполнения, но я бы не рекомендовал его для общего использования, поскольку он ориентирован на разработку PyGTK и расположение файлов Glade.
Я предполагаю, что есть и другие сторонние инструменты, и другие разработают.
Я согласен на 100%, но яичная бригада не согласится. файл в яйце бессмысленно.
«Я часто нахожу необходимость указывать пути в моем коде» - для начала это не очень похоже на Pythonic.
В идеале ваш код живет в каком-то месте, например, в пакетах сайтов, и на этом все.
Часто у нас есть установленное «приложение», которое использует довольно фиксированный набор каталогов для рабочих файлов. В Linux мы получаем эту информацию из переменных среды и файлов конфигурации, принадлежащих конкретному идентификатору пользователя, запускающему приложение.
Я не думаю, что вам следует указывать пути в своем коде. Думаю, есть способ получше.
[Я только что написал наш инструмент для установки приложения, который действительно создает все файлы конфигурации для довольно сложного приложения. Я использовал инструмент Mako templates для создания всех четырех файлов из шаблонов.]
Возможно, он не очень питонический, но как мне найти данные, которые используются моим приложением, написанным на Python? Я не могу найти способ сделать это в distutils (хотя в setuptools, похоже, это есть). Использование языка шаблонов - удивительное излишество; Я только хочу убедиться, что найду несколько путей!
@Magnus: в вашем приложении не должно быть никаких путей. Это должны быть параметры командной строки, параметры файла конфигурации или переменные среды.
OP здесь, мне, наконец, не удалось войти в систему, используя свой OpenID.
@ S.Lott
Мысль хорошо понята, но для некоторых дистрибутивов Linux кажется стандартной установкой данных для конкретных приложений и модулей для конкретных приложений в определенных местах. Я думаю, что возможность настраивать эти местоположения во время сборки / установки - это хорошо для людей, упаковывающих мое приложение. AFAICS «питонический путь» в этом случае заставит эти упаковщики применить исправления к моему коду.
У меня также есть привычка писать приложения, в которых исполняемая часть представляет собой крошечную оболочку вокруг основной функции в специфическом для приложения модуле. Мне кажется неправильным вставлять этот специализированный модуль в /usr/lib/python2.5/site-packages.
В настоящее время лучший способ связать данные с кодом - это setuptools и использовать pkg_resources:
from pkg_resources import resource_filename, resource_stream
stream = resource_stream("PACKAGE", "path/to/data_f.ile")
Это имеет то преимущество, что также работает с яйцами Python. У него есть (ИМХО) недостаток, заключающийся в том, что вам нужно помещать файлы данных в каталог кода, что является общепринятой практикой (одна из очень, очень немногих практик, с которыми я не согласен).
Что касается дистрибутивов Linux, я могу (разумно) заверить вас, что ваша программа будет работать без каких-либо проблем (и исправлений) в любой современной системе, производной от Debian, если вы используете pkg_resources. Я не знаю о Fedora / openSUSE, но полагаю, что это тоже работает.
Он работает в Windows, но в настоящее время не работает с py2exe - однако для этого есть простые обходные пути.
Я не думаю, что файл настолько плох. Это достойный способ найти модули, безусловно, лучше, чем описанная выше идея исправления жестко запрограммированных строк пути в сценариях.