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

使用python包分发运行脚本的正确方法?,python,module,packages,distutils,pythonpath,Python,Module,Packages,Distutils,Pythonpath,假设我有一个名为mypackage的python包,它有一系列脚本。一旦mypackage位于站点packages目录中,用户就可以像往常一样将mypackage中的各种Python文件引用为Python中的mypackage.submodule1、mypackage.submodule2。但是,其中一些是要从命令行调用的脚本。例如,在子模块1中,我有: == mypackage/submodule1.py == if __name__ == '__main__': main() def

假设我有一个名为mypackage的python包,它有一系列脚本。一旦mypackage位于站点packages目录中,用户就可以像往常一样将mypackage中的各种Python文件引用为Python中的mypackage.submodule1、mypackage.submodule2。但是,其中一些是要从命令行调用的脚本。例如,在子模块1中,我有:

== mypackage/submodule1.py ==

if __name__ == '__main__':
  main()

def main():
  # parse command line options here, do stuff
如何正确分发/打包mypackage,以便用户在“mypackage”进入其路径后可以干净地将这些子模块用作命令行脚本?我原以为你能做到:

python mypackage.submodule1.py arg1 arg2 ...
但是这种语法是无效的。换句话说,用户如何引用my package的子模块作为脚本,而不是从Py导入它们,而不要求实际的“mypackage”目录位于PYTHONPATH中?(只有顶级目录(例如,包含“mypackage”的站点包)应位于其PYTHONPATH中。)


谢谢。

我相信这样做的典型方法是将您希望作为脚本运行的模块放置在用户路径中的某个位置,例如
/usr/local/bin
。包括shebang行,这样您就可以在不指定解释器的情况下调用脚本,这样您就不会有问题了。

请参阅

一般的想法是分发setup.py文件,这样当用户运行python setup.py安装时,脚本就会被放置在路径上。几乎所有的包分发方法都支持这一点。如果您遵循上述文档,用户可以在系统允许的情况下进行
easy\u install
pip install
等操作

有关野外的示例,请参见。在文件的顶部有很多配置,但最重要的是在底部,您可以看到

setup(
    ...
    scripts = ['django/bin/django-admin.py'],
    ...
)

这将为安装django包的用户设置一个
django admin.py
命令。安装后,他们可以从命令行运行
django-admin.py arg1 arg2…

但是当用户安装软件包时,它会进入他们的站点软件包。所以它将是/some/path/site-packages/mypackage/submodule1.py。如何使脚本显示在/usr/local/bin中?作为安装的一部分,用户必须自己复制吗?在osx中,这似乎是在
/opt/local/Library/Frameworks/Python.framework/Versions/3.4/bin
中放置脚本,但它不在路径中。