python - 无法使用 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之间的来回。
解决方案
您的系统上似乎有 2 个 Python:
- 之后安装的第一个
ENV["PYTHON"]="";Pkg.build("PyCall")
--> 这是在 Julia 中安装 PyCall 以使一切正常的默认方式(这实际上是一个 Miniconda Python) - 您开始使用的系统 Python
python3
基本上,混合这 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
推荐阅读
- c# - LineRender 未在 Unity 版本 2018.2.10 上显示
- apache-spark - 从 Avro 文件读取时火花提交失败
- java - 在无头模拟器中运行时,仪器测试失败
- sql - 为此需要一个优化的查询
- modelsim - ModelSim 时间线间隔修复
- css - Ionic 4 - CSS 全局最大页面宽度
- node.js - 在 tensorflow.js 中确定 LSTM 网络的输入形状
- unity3d - Unity3D:使用 AnimationCurve 动态设置 AudioSource 音量
- android - 在 gradle 中重构 maven 块
- php - 在 PDO 查询中添加取消链接