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

问题描述:

假设我有一个名为mypackage的Python包,它有一系列脚本。一旦mypackage位于site-packages目录中,用户可以像往常一样将mypackage中的各种Python文件称为mypackage.submodule1,Python中的mypackage.submodule2。但是,其中一些是要从命令行调用的脚本。在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中? (只有顶层目录,例如site-packages,其中包含“mypackage”应该在它们的PYTHONPATH中。)

谢谢。

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

的总体思路是,以分发setup.py文件,这样当用户运行蟒蛇的setup.py安装脚本被放置在路径上。几乎所有的软件包分发方法都支持这一点。如果你按照上面的文档,用户可以在系统允许的情况下使用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 ...

+0

在osx上,这似乎把脚本放在'/ opt/local/Library/Frameworks/Python.framework/Versions/3.4/bin'中,这不在PATH中。 – qed 2014-10-31 15:06:33

我相信这样做的典型方法是将您想要作为脚本运行的模块放置在位于用户PATH中的位置,例如/usr/local/bin。包含一个shebang行,以便您可以在不指定解释器的情况下调用脚本,并且应该没问题。

+0

但是,当用户安装软件包时,它会进入他们的站点包。所以它会是/some/path/site-packages/mypackage/submodule1.py。我怎样才能让脚本出现在/ usr/local/bin?用户是否必须自己复制它作为安装的一部分?这看起来很笨拙 – user248237dfsf 2011-12-23 22:00:05