【问题标题】:can't call julia code from Python with PyCall, whose code calls python back with Pycall无法使用 PyCall 从 Python 调用 julia 代码,其代码使用 Pycall 回调 python
【发布时间】:2021-11-11 05:03:39
【问题描述】:

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

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

test.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")

test.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

版本信息() 朱莉娅版本 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 字大小:64 LIBM:libopenlibm LLVM:libLLVM-11.0.1(ORCJIT,skylake-avx512)

编辑:

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

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

【问题讨论】:

    标签: python python-3.x julia pycall


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 你能提供一些关于为什么 2 种不同的 Python 在这种情况下不能共存的信息吗?我可以想象两个活跃的 Python 解释器无法共享数据,但代码似乎并没有试图让它们进行通信。 ENV["PYTHON"] 被设置为 Miniconda Python 是否会以某种方式摆脱活动的 CPython?
    • 他们可以但基本上所有库都需要匹配。这只是我的经验经验——如果库中存在最细微的差异并且你跨 python 一切都会停止工作。在这里,您遇到了最糟糕的情况 - 一个 Python 是 Miniconda,另一个 Python 是系统 Python。我不是 Python 专家,但每当我尝试混合时,它总是以 Python 库地狱告终。例如,Python Anaconda 有一个内置 pip。你可以在 Anacpnda pip install numpy 上做 - 如果你这样做,Python Anaconda 中的一切都会停止工作(另一个个人经验观察)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多