首页 > 解决方案 > 无法使用 PyCall 从 Python 调用 julia 代码,其代码使用 Pycall 回调 python

问题描述

我有一个进行 julia 调用的后端算法,我通过 PyCall 包执行此操作。但是,最近更新了 julia 中的一个包,它本身使用了 PyCall。无论我尝试做什么,我总是会出错。如果我通过 Pkg.build("PyCall") 在 julia 中设置 pycall,我可以调用包,但是 python 不能调用 julia。如果我通过 julia.install() 在 python3 中设置 pycall,则该包无法在 julia 中正常运行。

在这里重现这个是一个简单的例子:

测试.jl

using Pkg
Pkg.add("PyCall")
ENV["PYTHON"]=""
Pkg.add(PackageSpec(url="https://bitbucket.org/SSamanipour/safd.jl/src/master/"))
Pkg.build("SAFD")
Pkg.test("SAFD")

测试.py

from julia import Main as jl
jl.include("test.jl")

如果我跑python3 test.py

我遇到一个错误,因为该特定 python 未配置 py 共享 pycall。

我想要的是python中的pycall与python不同。似乎如果您将 pycall 配置为一个,它将强制另一个。

我尝试使用 juliacall,但是如果我将 pycall 与它一起使用,它似乎也会中断。

如果我尝试拥有ENV["PYTHON"]="python3",我将无法运行 SAFD 包。

任何帮助将不胜感激,因为我已经在这方面待了几天并尝试了多种解决方案,但一切似乎都给了我一个不同的错误。

一些信息:在 aws amazon2 linux 操作系统和 aws r5.large 实例上执行此操作。

我正在使用 python 3.10.0

versioninfo() Julia 版本 1.6.3 提交 ae8452a9e0 (2021-09-23 17:34 UTC) 平台信息:操作系统:Linux (x86_64-pc-linux-gnu) CPU:Intel(R) Xeon(R) Platinum 8175M CPU @ 2.50GHz WORD_SIZE:64 LIBM:libopenlibm LLVM:libLLVM-11.0.1(ORCJIT,skylake-avx512)

编辑:

我最终解决了这个问题,我尝试使用的包更新了它的依赖项,当它构建时,它会自动使用它需要的所有包更新 conda python。但是,如果它不是由 conda 构建的,它将假定存在依赖项。令我感到非常惊讶的是,错误消息从未表明任何有关特定包的信息。我只是偶然发现了一点。

有一点很清楚,你不能有两个不同的python,pycall只配置一个python用于python和julia之间的来回。

标签: pythonpython-3.xjuliapycall

解决方案


您的系统上似乎有 2 个 Python:

  • 之后安装的第一个ENV["PYTHON"]="";Pkg.build("PyCall")--> 这是在 Julia 中安装 PyCall 以使一切正常的默认方式(这实际上是一个 Miniconda Python)
  • 您开始使用的系统 Pythonpython3

基本上,混合这 2 条 Python 并让一切正常工作就像大海捞针被蒙住眼睛。而不是你需要使用一个 Python 来处理所有事情并让事情顺利运行,这应该是 Julia 在执行 ENV["PYTHON"]="";Pkg.build("PyCall").

为了在 Julia 控制台中找到要使用的 Python:

julia> using PyCall

julia> PyCall.python
"/home/ubuntu/.julia/conda3/python.exe"

现在您找到了所需的 Python 代码!所以你在 bash 中运行的是:

/home/ubuntu/.julia/conda3/python.exe test.py

推荐阅读