【问题标题】:proper way to distribute run scripts with python package?使用 python 包分发运行脚本的正确方法?
【发布时间】:2011-12-24 06:26:42
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: python module packages distutils pythonpath


    【解决方案1】:

    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 ...

    【讨论】:

    • 在 osx 上,这似乎将脚本放在/opt/local/Library/Frameworks/Python.framework/Versions/3.4/bin 中,而不是在 PATH 中。
    【解决方案2】:

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

    【讨论】:

    • 但是当用户安装包时,它会进入他们的站点包。所以它将是/some/path/site-packages/mypackage/submodule1.py。如何让脚本出现在 /usr/local/bin 中?作为安装的一部分,用户是否必须自己复制它?这看起来很笨重
    猜你喜欢
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2015-09-14
    • 2020-06-14
    • 2022-01-06
    • 2015-11-07
    相关资源
    最近更新 更多