2010-10-29 53 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 2015-05-21 09:34:03

+0

有用的链接:https://www.reddit.com/r/Python/comments/2gki9e/python_apps_the_right_way_entry_points_and_scripts/ – 2016-02-05 04:08:27

回答

-3

只要封装在python路径上,就在脚本末尾添加 。

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

将运行模块e.g

 
python -m random 
+5

这不为包装工作。 OP知道模块的'-m'开关。 – 2011-10-19 07:29:59

4

我想这可能是Python 2.6中的限制。我已经测试了它,并且执行了一个包(在.中或通过easy_install从一个egg中安装),-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中的一个bug,它完全被允许,因此2.6不仅再次禁用了它,而且还添加了一个测试以确保它保持禁用状态(正确地使用 与ImportError拒绝它,就像2.6一样)。

您有几种选择,你可以随时运行它指定主:

$ python -m module.__main__ 

或者你可以编写检测Python版本的shell脚本包装,然后执行它在不同的风格。

或者你可以执行的命令行代码,将导入,然后运行该模块,那么也许将在一个shell脚本:

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

在我自己的命令行项目都在我的捕获错误的shell脚本(python未安装,等等),但shell脚本也将执行导入代码并检测是否已安装必要的模块并提示错误(使用有用的链接或安装文本)。

相关问题