4

假设我有一个名为 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 中。)

谢谢。

4

2 回答 2

4

请参阅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 ...

于 2011-12-23T22:14:33.727 回答
0

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

于 2011-12-23T21:57:11.980 回答