我正在开发一个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仍然试图将它们整合在一起。
答案 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