假设我有一个名为 mypackage 的 python 包,其中包含一系列脚本。一旦 mypackage 位于 site-packages 目录中,用户就可以像往常一样从 Python 中引用 mypackage 中的各种 Python 文件作为 mypackage.submodule1、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”的站点包应该在它们的 PYTHONPATH 中。)
谢谢。
最佳答案
参见 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 ...
。
关于python - 使用 python 包分发运行脚本的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8620789/