我正在尝试构建一个简单的包以上传到 anaconda 云。我已经走了很长一段路来让一个小例子工作,但我无法在目标机器上使用由 conda 构建的包(总是给我一个 ModuleNotFound-Error)。但是,我怀疑这是目标机器的错误(更可能是构建过程搞砸了) - 所以请耐心等待,让我解释一下我做了什么。
我的 python 代码只是一个文件,里面有一个函数
def plusone(number):
return number+1
如前所述,我想使用 conda-build 进行构建并将包上传到我的 anaconda 云频道。我创建了一个名为 conda-recipe 的文件夹,其中包含 bld.bat、build.sh 和 meta.yaml 文件。所以完整的结构是这样的:
conda test (<- root folder)
conda-recipe
bld.bat
build.sh
meta.yaml
dist
<files created by running setup.py>
plusone
__init__py
plusone.py
plusone.egg-info
<created info-files>
README.md
requirements.txt (<- only contains a ".")
setup.py
我通过 Anaconda 命令行工具更改为项目根目录,然后运行
conda build conda-recipe
一切似乎都工作正常,上传到 anaconda 云也正在工作(上传包)。如果我换到另一台机器,我什至可以通过运行安装包
conda install -c <MYCHANNEL> <PACKAGENAME>
但是,当我从 Jupyter Notebook 或 Pycharm 中运行包时,我收到关于我的包的“ModuleNotFound”错误。首先,我认为这可能与我的目标系统(即我使用包的位置)有关,我已经阅读了几篇文章,其中我确保 PYTHONPATH 设置正确,并且 python 安装确实查看了所在的文件夹包安装到。我知道这个包真的被安装了,python 安装会查看相应的目录。此外,conda list
表示该软件包已安装。
在这个问题上投入了 1 1/2 天后,我花时间审查了我的构建过程并完成了以下工作:如果我只运行带有参数 sdist 的 setup.py 文件,则会创建一个 tar.gz 文件。我可以上传这个,anaconda cloud 识别出该文件是一个 pypi-Archive。我什至可以在目标机器上下载并安装这个文件并在那里成功使用它。所以,一般来说,我会说我的代码没问题(惊喜),目标机器的 python 安装也没问题。因此,我回到了 conda-build-command。相信我,我不止一次看过文档。
但是, conda-build 的输出在结尾处显示以下内容:
Packaging plusone
INFO:conda_build.build:Packaging plusone
INFO conda_build.build:build(1571): Packaging plusone
Packaging plusone-12.0-0
INFO:conda_build.build:Packaging plusone-12.0-0
INFO conda_build.build:bundle_conda(891): Packaging plusone-12.0-0
No files or script found for output plusone
WARNING:conda_build.build:No files or script found for output plusone
WARNING conda_build.build:bundle_conda(971): No files or script found for output plusone
number of files: 0
对我来说,这表明 conda 构建过程并没有真正产生可行的输出。因此,我尝试了几个选项来指定 meta.yaml 中的源部分:url、git_url、路径。没有一个导致不同的输出。以最新形式查看我的 meta.yaml:
package:
name: "plusone"
version: 12.0
requirements:
host:
- python=3.7
- pip
- setuptools
run:
- python
source:
path: ../plusone
我的 bld.bat:
<ABSOLUTE path to python>\\python.exe "<ABSOLUTE path to setup>\\setup.py" install
if errorlevel 1 exit 1
我的 build.sh:$PYTHON setup.py install
无论我如何更改我的 meta.yaml 文件,我总是得到没有找到输出文件的输出。但是,当检查 anaconda 构建目录时,我可以看到有名为 src_cache 和 git_cache 的非空文件夹,因此我知道 anaconda 至少可以访问这些文件。
所以 - 谁能告诉我,为什么
- conda build 告诉我有 0 个文件
- 我不能使用我的 conda 模块,它总是给我一个 ModuleNotFound 错误?