如何创建Conda包/应用程序的入口点?

时间:2018-04-30 18:36:59

标签: python anaconda conda

我正在开发一个Python应用程序,并使用Conda来分发它并管理依赖项。

我已成功运行conda-build将我的代码包装到.tar.bz2文件中。我创建了一个新的conda环境,并测试了安装包。一切正常,我能够以这种方式运行我的代码。

我想知道的是,我如何构建我的包和/或Python代码,以便我可以通过简单地键入我的conda环境来运行我的脚本,而不是导航到我开发代码的文件夹? / p>

例如,在这个conda备忘单中:https://conda.io/docs/_downloads/conda-cheatsheet.pdf,从顶部开始的第四行,“安装后运行包,示例Spyder”运行的命令只是“spyder”。

我的Python程序是从单个.py文件launch.py​​启动的,但是如何让conda知道要调用哪个脚本?当我现在这样做时,它只是说“找不到命令”。

元数据规范中的这一部分似乎相关:https://conda.io/docs/user-guide/tasks/build-packages/define-metadata.html#entry-point

我尝试在我的meta.yaml中将其设置为“entry:python launch.py​​”,重建并重新安装,但这不起作用,我不知道从哪里开始。

非常感谢任何帮助,谢谢。

编辑:经过多次挖掘后,我可能已找到答案,似乎我想创建一个如此处所述的入口点:https://setuptools.readthedocs.io/en/latest/setuptools.html#dynamic-discovery-of-services-and-plugins仍然试图将它们整合在一起。

1 个答案:

答案 0 :(得分:4)

假设您的包结构类似于

my_package/
├── my_package/
│   ├── __init__.py
|   ├── __main__.py
├── conda.recipe/
│   ├── meta.yaml
├── setup.py

meta.yaml中的conda配方不需要进入conda.recipe文件夹,如果要将配方与其余代码一起存储,这很方便。现在,在__main__.py中,您有一些要调用的代码(此代码可以在任何模块中,__main__.py恰好是一个方便的示例,因为如果您运行{{1}中的代码也会执行1}})。 python -m my_package中的代码可能类似于

__main__.py

现在,在您的import sys # Import whatever else from your package or otherwise to run the code def main(argv): # Process command line arguments, etc if __name__ == '__main__': sys.exit(main()) 中,您将拥有以下内容:

meta.yaml

关键是package: name: my_package version: '1.0.0' source: path: .. build: number: 0 script: python setup.py install --single-version-externally-managed --record=record.txt entry_points: - my_package_script = my_package.__main__:main requirements: - ... 。此处的语法与my_package_script = my_package.__main__:main入口点的语法相同:

setup.py

因此,在我们的示例中,我们使用script name = package name.module name:function name 包中main模块的__main__.py函数。

有关完整示例,您可以在此处查看我的包:https://github.com/bryanwweber/CanSen