правильный способ распространения сценариев запуска с пакетом Python? - PullRequest
3 голосов
/ 24 декабря 2011

Предположим, у меня есть пакет python под названием mypackage, в котором есть серия скриптов. Когда mypackage входит в каталог site-packages, пользователь может, как обычно, ссылаться на различные файлы Python в mypackage как mypackage.submodule1, mypackage.submodule2 из Python. Однако некоторые из них являются сценариями, которые должны вызываться из командной строки. Например, в субмодуле1 у меня есть:

== mypackage/submodule1.py ==

if __name__ == '__main__':
  main()

def main():
  # parse command line options here, do stuff

Как правильно распределить / упаковать mypackage, чтобы пользователь мог без проблем использовать эти подмодули в качестве сценариев командной строки, когда «mypackage» находится на их пути? Я бы подумал, что вы можете сделать:

python mypackage.submodule1.py arg1 arg2 ...

но этот синтаксис недопустим. Другими словами, как пользователь может ссылаться на подмодули моего пакета как на скрипты, а не импортировать их из Py, не требуя, чтобы фактический каталог "mypackage" был в их PYTHONPATH? (В каталоге PYTHONPATH должен быть только каталог верхнего уровня, например site-packages, который содержит «mypackage».)

Спасибо.

Ответы [ 2 ]

3 голосов
/ 24 декабря 2011

См. http://docs.python.org/distutils/setupscript.html#installing-scripts

Общая идея состоит в том, чтобы распространять файл setup.py, чтобы при запуске пользователем python setup.py install сценарий помещался в путь. Почти все методы распространения пакетов поддерживают это. Если вы будете следовать приведенной выше документации, пользователи могут easy_install, pip install и т. Д., Как позволяет их система.

Для примера в диком виде см. https://github.com/django/django/blob/master/setup.py. В верхней части файла много настроек, но важный бит находится внизу, где вы можете увидеть

setup(
    ...
    scripts = ['django/bin/django-admin.py'],
    ...
)

Это устанавливает команду django-admin.py для пользователей, которые устанавливают пакет django. После установки они могут запустить django-admin.py arg1 arg2 ... из командной строки.

0 голосов
/ 24 декабря 2011

Я считаю, что типичный способ сделать это - поместить модули, которые вы хотите запускать как скрипты, в место, такое как /usr/local/bin, которое находится в ПУТИ пользователя.Включите строку shebang, чтобы вы могли вызывать сценарий без указания переводчика, и с вами все будет в порядке.

...