2010-10-29 4 views
23

Есть ли способ включить пакет в качестве сценария? Например:Выполнить установленный пакет Python как скрипт?

[~]# easy_install /path/to/foo.egg 
... 
[~]# python -m foo --name World 
Hello World 

Я попытался создать __main__.py файл в моем пакете, но это не выполняется (я использую Python 2.6). возникает следующая ошибка:

foo is a package and cannot be directly executed 

Структура моего пакета выглядит следующим образом:

foo/ 
    setup.py 
    foo/ 
    __init__.py 
    __main__.py 

Запуск python -m foo.__main__ --name World работает, как ожидалось, но я предпочел бы прежний способ исполнения. Это возможно?

+0

https://stackoverflow.com/questions/6630822/running-a-python-package – n611x007

+0

Полезная ссылка: https://www.reddit.com/r/Python/comments/2gki9e/python_apps_the_right_way_entry_points_and_scripts/ –

ответ

-3

до тех пор, пока пакет находится на пути python, добавьте в конце скрипта.

if __name__ == "__main__": 
    call_script() 
$ python -m module_name

будет работать модуль например

 
python -m random 
+5

Это не работа для пакетов. OP знает о переключателе '-m' для модулей. –

4

Я думаю, что это может быть ограничение Python 2.6. Я протестировал его, и выполнение пакета (либо в ., либо из яйца с easy_install) с опцией -m работает отлично в 2.7, но не в 2.6. Например, в моей системе (Ubuntu) с тестовым пакетом называется pkg_exec в текущем каталоге, и где __main__.py просто печатает sys.argv:

[email protected]:~/tmp/pkg_exec$ python2.6 -m pkg_exec 
/usr/bin/python2.6: pkg_exec is a package and cannot be directly executed 
[email protected]:~/tmp/pkg_exec$ python2.7 -m pkg_exec 
['/home/xx/tmp/pkg_exec/pkg_exec/__main__.py'] 

Кроме того, в соответствии с the 2.7 docs:

Изменено в версии 2.7 : Введите имя пакета для запуска подмодуля __main__.

26

Это регресс в Python 2.6. См issue2571:

Способность выполнять пакеты никогда не предназначалось, поскольку это брейки импорта в различных тонкостях. На самом деле это была ошибка в 2.5, что она была разрешена вообще, поэтому 2.6 не только отключил ее снова, но и добавил тест, чтобы убедиться, что он отключен (2.4 правильно отклонил его с помощью ImportError, как и 2.6).

У вас есть несколько вариантов, вы можете всегда запустить его с указанием основной:

$ python -m module.__main__ 

Или вы можете написать обертку сценарий оболочки, который определяет версию питона, а затем запускает его в другом стиле.

Или вы можете выполнить код в командной строке, которая будет импортировать, а затем запустить модуль, а затем, возможно, место, которое в сценарии оболочки:

$ python -c "import module; module.main()" 

В моих собственных проектах командной строки У меня есть оба сценарий оболочки, который ловит ошибки (python не устанавливается и т. д.), но сценарий оболочки также выполнит код импорта и определит, были ли установлены необходимые модули и предложена ошибка (с полезной ссылкой или установкой текста).

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