2011-12-23 5 views
3

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

== 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? (Только каталог верхнего уровня, например сайт-пакеты, который содержит «mypackage», должен находиться в их PYTHONPATH.)

Спасибо.

ответ

3

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

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

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

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

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

+0

В osx это, кажется, помещает скрипты в '/ opt/local/Library/Frameworks/Python.framework/Versions/3.4/bin', который не находится в PATH. – qed

0

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

+0

Но когда пользователи устанавливают пакет, он получает в своих сайтах пакеты. Это будет /some/path/site-packages/mypackage/submodule1.py. Как заставить скрипты появляться в/usr/local/bin? Нужно ли самим пользователям копировать их как часть установки? Это кажется неуклюжим – user248237dfsf

Смежные вопросы