作为脚本执行已安装的Python包?

Phi*_*ham 32 python

有没有办法让包作为脚本执行?例如:

[~]# easy_install /path/to/foo.egg
...
[~]# python -m foo --name World
Hello World
Run Code Online (Sandbox Code Playgroud)

我已经尝试__main__.py在我的包中创建一个文件,但它没有被执行(我使用的是Python 2.6).引发以下错误:

foo is a package and cannot be directly executed
Run Code Online (Sandbox Code Playgroud)

我的包的结构如下:

foo/
  setup.py
  foo/
    __init__.py
    __main__.py
Run Code Online (Sandbox Code Playgroud)

运行python -m foo.__main__ --name World按预期工作,但我更喜欢以前的执行方式.这可能吗?

nik*_*cub 33

这是Python 2.6中的回归.见issue2571:

从来没有打算执行包的能力,因为这样做会以各种微妙的方式打破导入.它实际上是2.5中允许的一个错误,因此2.6不仅再次禁用它,而且还添加了一个测试以确保它保持禁用状态(2.4使用ImportError正确拒绝它,就像2.6一样).

你有几个选项,你可以总是运行它指定main:

$ python -m module.__main__
Run Code Online (Sandbox Code Playgroud)

或者您可以编写一个shell脚本包装器来检测python版本,然后以不同的样式执行它.

或者您可以在命令行上执行将导入然后运行模块的代码,然后将其放在shell脚本中:

$ python -c "import module; module.main()"
Run Code Online (Sandbox Code Playgroud)

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


nfi*_*ine 5

我认为这可能是Python 2.6的限制。我已经测试过它,并且.使用该选项执行一个包(无论是在 Egg 中还是通过 easy_install 安装)-m在 2.7 中工作正常,但在 2.6 中则不然。例如,在我的系统(Ubuntu)上,pkg_exec在当前目录中调用一个测试包,并且__main__.py简单地打印sys.argv

xx@xx:~/tmp/pkg_exec$ python2.6 -m pkg_exec
/usr/bin/python2.6: pkg_exec is a package and cannot be directly executed
xx@xx:~/tmp/pkg_exec$ python2.7 -m pkg_exec
['/home/xx/tmp/pkg_exec/pkg_exec/__main__.py']
Run Code Online (Sandbox Code Playgroud)

另外,根据2.7 文档

版本 2.7 中更改:提供包名称来运行__main__子模块。


mos*_*lix -2

只要包位于 python 路径上,就在脚本末尾添加。

if __name__ == "__main__":
     call_script()
Run Code Online (Sandbox Code Playgroud)
$ python -m 模块名称  

将运行该模块,例如

python -m 随机

  • 这不适用于包。OP 知道模块的“-m”开关。 (7认同)