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

D. *_*Lef 5 python anaconda conda

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

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

我想知道的是,如何构造我的程序包和/或Python代码,这样我可以通过在活动的conda环境中简单键入内容而不是导航到开发代码的文件夹中来运行脚本?

例如,在以下conda速查表中:https ://conda.io/docs/_downloads/conda-cheatsheet.pdf ,从顶部开始的第四行,“在安装后运行软件包,例如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-服务和插件尽管仍在尝试将其整合在一起。

dar*_*ith 6

假设您的包装结构类似于

my_package/
??? my_package/
?   ??? __init__.py
|   ??? __main__.py
??? conda.recipe/
?   ??? meta.yaml
??? setup.py
Run Code Online (Sandbox Code Playgroud)

其中的conda配方meta.yaml不需要放在conda.recipe文件夹中,如果您想将配方与其余代码一起存储,则非常方便。现在,在中__main__.py,您有一些要调用的代码(该代码可以在任何模块中,__main__.py碰巧是一个方便的示例,因为如果您运行,其中的代码也将被执行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())
Run Code Online (Sandbox Code Playgroud)

现在,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:
  - ...
Run Code Online (Sandbox Code Playgroud)

关键是my_package_script = my_package.__main__:main。此处的语法与setup.py入口点的语法相同:

script name = package name.module name:function name
Run Code Online (Sandbox Code Playgroud)

因此,在我们的示例中,我们使用了包中模块中的main函数。__main__.pymy_package

对于完整的示例,您可以在这里查看我的软件包:https : //github.com/bryanwweber/CanSen