假设我有一个名为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中。)
感谢。
答案 0 :(得分:3)
请参阅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 ...
。
答案 1 :(得分:0)
我认为这样做的典型方法是将要运行的模块作为脚本放在用户PATH中的/usr/local/bin
位置。包括一个shebang行,这样你可以在不指定解释器的情况下调用脚本,你应该没事。