用Python包分发运行脚本的正确方法是什么?
假设我有一个叫做 mypackage 的 Python 包,这个包里面有一系列的脚本。一旦 mypackage 被放到 site-packages 目录下,用户就可以像平常一样通过 mypackage.submodule1 和 mypackage.submodule2 来引用这个包里的各种 Python 文件。不过,这些子模块中有一些是专门用来从命令行调用的。比如在 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 ...
但这个语法是无效的。换句话说,用户如何才能把我的包的子模块当作脚本来用,而不是从 Python 中导入它们,而不需要实际将 "mypackage" 目录放到他们的 PYTHONPATH 中?(只需要顶层目录,比如 site-packages,里面包含 "mypackage" 的目录在他们的 PYTHONPATH 中就可以了。)
谢谢。
2 个回答
我觉得通常的做法是把你想要作为脚本运行的模块放在一个像 /usr/local/bin
这样的地方,这个地方在用户的路径中。记得加上一个“shebang”行,这样你就可以直接调用这个脚本,而不用指定解释器,这样就没问题了。
可以查看这个链接:http://docs.python.org/distutils/setupscript.html#installing-scripts
大致的意思是,你需要提供一个叫做 setup.py 的文件,这样当用户运行命令 python setup.py install 时,脚本就会被放到系统的路径上。几乎所有的包分发方法都支持这种方式。如果你按照上面的文档操作,用户就可以用 easy_install
、pip 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 ...
来使用这个命令。