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

标签 python module package distutils pythonpath

假设我有一个名为 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_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 ...

关于python - 使用 python 包分发运行脚本的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8620789/

相关文章:

python - 如何使用 asyncio 使用 SubprocessProtocol 从子进程中读取并在任意点终止该子进程?

module - DDD : Where to Place Domain Events

java - 从包内部访问父文件夹包

go - 如何使用.a文件编译golang程序(无源码)

python - sqlite3.操作错误: no such column:

python - 带有表单数据的 POST 请求

python - pandas 从日期范围列中提取开始和结束日期

python - 与导入的模块共享调用者的命名空间

angular - 找不到模块'node-sass

r - 使用自己编写的包部署 Shiny 应用程序