如何创建 Conda package/application 的入口点?
How to I create an entry point to a Conda package/application?
我正在开发一个 Python 应用程序,并使用 Conda 来分发它和管理依赖项。
我已成功 运行 conda-build 将我的代码打包到 .tar.bz2 文件中。我创建了一个新的 conda 环境,并测试了安装包。一切正常,我能够 运行 我的代码是这样的。
我想知道的是,我如何构建我的程序包 and/or Python 代码,以便我可以 运行 我的脚本只需在我的 conda 环境处于活动状态时输入,而不是而不是导航到我开发代码的文件夹?
例如,在这个 conda 备忘单中:https://conda.io/docs/_downloads/conda-cheatsheet.pdf,从顶部开始的第四行,"Run a package after install, example Spyder" 运行 的命令只是 "spyder".
我的 Python 程序是从单个 .py 文件 launch.py 启动的,但是我如何让 conda 知道要调用哪个脚本?当我现在这样做时,它只是说 "command not found".
元数据规范中的这一部分似乎相关: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不过仍在尝试将它们放在一起。
假设您的包结构类似于
my_package/
├── my_package/
│ ├── __init__.py
| ├── __main__.py
├── conda.recipe/
│ ├── meta.yaml
├── setup.py
meta.yaml
中的 conda 配方不需要放在 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())
现在,在您的 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
因此,在我们的示例中,我们使用 my_package
包中 __main__.py
模块的 main
函数。
一个完整的例子,你可以在这里看看我的包:https://github.com/bryanwweber/CanSen
我正在开发一个 Python 应用程序,并使用 Conda 来分发它和管理依赖项。
我已成功 运行 conda-build 将我的代码打包到 .tar.bz2 文件中。我创建了一个新的 conda 环境,并测试了安装包。一切正常,我能够 运行 我的代码是这样的。
我想知道的是,我如何构建我的程序包 and/or Python 代码,以便我可以 运行 我的脚本只需在我的 conda 环境处于活动状态时输入,而不是而不是导航到我开发代码的文件夹?
例如,在这个 conda 备忘单中:https://conda.io/docs/_downloads/conda-cheatsheet.pdf,从顶部开始的第四行,"Run a package after install, example Spyder" 运行 的命令只是 "spyder".
我的 Python 程序是从单个 .py 文件 launch.py 启动的,但是我如何让 conda 知道要调用哪个脚本?当我现在这样做时,它只是说 "command not found".
元数据规范中的这一部分似乎相关: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不过仍在尝试将它们放在一起。
假设您的包结构类似于
my_package/
├── my_package/
│ ├── __init__.py
| ├── __main__.py
├── conda.recipe/
│ ├── meta.yaml
├── setup.py
meta.yaml
中的 conda 配方不需要放在 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())
现在,在您的 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
因此,在我们的示例中,我们使用 my_package
包中 __main__.py
模块的 main
函数。
一个完整的例子,你可以在这里看看我的包:https://github.com/bryanwweber/CanSen