Куда положить папку Python Utils? - PullRequest
4 голосов
/ 08 марта 2011

У меня есть целая куча скриптов, организованных так:

root
  group1
    script1.py
    script2.py
  group2
    script1.py
    script2.py
  group3
    script1.py
    script2.py
  utils
    utils1.py
    utils2.py

Все скрипты * .py используют функции внутри папки utils. На данный момент я добавляю путь к утилитам в скрипты, чтобы импортировать утилиты.

Тем не менее, это, кажется, плохая практика (или "не Pythonic"). Кроме того, на самом деле группы не такие плоские, как эта, и папок утилит больше, чем указано выше. Следовательно, решение пути добавления становится все более и более запутанным.

Как я могу организовать это по-другому?

Ответы [ 4 ]

3 голосов
/ 08 марта 2011

Сначала сделайте все каталоги импортируемыми, т.е. используйте __init__.py. Затем создайте сценарий верхнего уровня, который принимает аргументы и вызывает сценарии, основанные на этом.

В течение длительного времени справедливо то, что Кит упоминал о distutils. В противном случае здесь есть более простое (конечно, не лучшее) решение.

Организация

runscript.py
group1
    __init__.py
    script1.py
utils
    __init__.py
    utils1.py

1012 * Воззвание *

python runscript -g grp1 -s script1

runscript.py

import utils

def main():
    script_to_exec = process_args()
    import script_to_exec as script # __import__
    script.main()

main()

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

1 голос
/ 08 марта 2011

Мы не можем точно знать, какой у вас сценарий использования из надуманного примера. Я бы порекомендовал сделать пакет, содержащий ваш модуль утилит и другие сценарии, а затем использовать относительный импорт из сценариев, например from ..utils import utils1. Конечно, вы бы не назвали верхний пакет «корневым», но выбрали бы имя, например, имя вашего проекта.

Если у вас действительно много таких сценариев, возможно, имеет смысл иметь сценарий однократного запуска, который затем импортирует модули в соответствии с параметрами cmdline. Что-то вроде runner.py <somecommand> затем импортировало бы и выполняло <top package>.commands.somecommand.runFunction (например, Django делает это расширяемым проектом).

1 голос
/ 08 марта 2011

Вас также может заинтересовать: Python 3: Хорошие места для установки собственных и сторонних пакетов?

Да, я вижу, как пакеты помогают, ноВыполнение установки требует больших затрат, если вы все еще работаете над утилитами и меняете их, когда работаете с группой 1, группой 2 и т. д.

Все еще ищете хороший ответ на этот вопрос.

0 голосов
/ 08 марта 2011

Вам нужно использовать пакеты. Python распознает каталог как пакет, если в нем есть файл с именем __init__.py. Еще лучше использовать distutils , чтобы создать пакет с исходным кодом, который также установит его для вас. Изменение sys.path почти никогда не должно выполняться, и установка пакетов поместит его в стандартное место (site-packages), поэтому вам не нужно его изменять.

...