使用python包分发运行脚本的正确方法?

时间:2011-12-23 21:29:47

标签: python module packages distutils pythonpath

假设我有一个名为mypackage的python包,它包含一系列脚本。一旦mypackage在site-packages目录中,用户可以像往常一样将mypackage中的各种Python文件称为mypackage.submodule1,来自Python的mypackage.submodule2。但是,其中一些是要从命令行调用的脚本。例如,在submodule1中,我有:

== 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”的site-packages应该在他们的PYTHONPATH中。)

感谢。

2 个答案:

答案 0 :(得分:3)

请参阅http://docs.python.org/distutils/setupscript.html#installing-scripts

一般的想法是分发一个setup.py文件,这样当用户运行python setup.py install时,脚本就会被放置在路径上。几乎所有的包分发方法都支持这一点。如果您按照上述文档操作,则系统允许用户easy_installpip install等。

有关野外的示例,请参阅https://github.com/django/django/blob/master/setup.py。文件顶部有很多配置,但重要的位在底部,你可以看到

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

这为安装django软件包的用户设置了django-admin.py命令。安装后,他们可以从命令行运行django-admin.py arg1 arg2 ...

答案 1 :(得分:0)

我认为这样做的典型方法是将要运行的模块作为脚本放在用户PATH中的/usr/local/bin位置。包括一个shebang行,这样你可以在不指定解释器的情况下调用脚本,你应该没事。