Julia语言虽然好,但是包管理方面和生态环境感觉还有一点小小的缺陷,但是Julia可以调用Python丰富的包,用起来很方便。
安装PyCall
在安装之前先确认下Julia和Python的版本,我使用的稳定版本的 Julia1.6.7,Python版本是 Python3.10.9,并确认好已经下载了需要的Python包,还未下载的可以在终端输入:
pip install matplotlib
pip install sympy
pip install scipy
使用Julia语言调用Python需要先下载 PyCall 包和 Conda包:
using Pkg
Pkg.add("PyCall")
PyCall官网:GitHub - JuliaPy/PyCall.jl: Package to call Python functions from the Julia language 官网中一些示例代码是旧版本代码,个别细节需要做一些更改。
我平时习惯在REPL交互解释器里使用 ] 符号进入包管理模式,随后
add PyCALL
Pkg Conda
退出包管理模式按一下 删除键 就可以。
下载完PyCall包后,在Julia终端里配置下Python路径,这里需要定位到python.exe文件。
ENV["PYTHON"] = raw"C:\\GGBond\\your path\\python.exe"
随后再Julia终端输入:
Pkg.build("PaCall")
这时候可以在Julia终端进入包管理模式,输入命令查看已安装的Julia包,此时PyCall包已安装完成:
status
在包管理模式输入 ? 查看Julia包管理的命令
调用Python代码
这是可以试用下官网示例代码:
1.调用Python的open函数
这里和官网使用 @pywith 的版本不一样
using PyCall
#=
调用Python的内置open函数来创建一个.txt文件
使用PyCall提供的字符串宏py"""来执行Python代码
=#
py"""
with open("GGboy.txt", "w") as f:
f.write("hello mr.Dick")
"""
#=
旧版本代码
@pywith pybuiltin("open")("file.txt","w") as f begin
f.write("hello")
end
=#
生成的文件:
2.调用Python的math函数
using PyCall
math = pyimport("math")
a = math.sin(math.pi / 4) # returns ≈ 1/√2 = 0.70710678...
println(a)
3.Julia中定义Python函数或类,并在Julia函数中使用函数
module MyModule
using PyCall
let
py"""
import numpy as np
def one(x):
return np.sin(x) ** 2 + np.cos(x) ** 2
"""
global py_one # 声明一个全局变量来存储Python函数
py_one = py"one" # 将Python函数赋值给Julia全局变量
end
two(x) = py_one(x) + py_one(x)
end
#=
旧版本代码
module MyModule
using PyCall
function __init__()
py"""
import numpy as np
def one(x):
return np.sin(x) ** 2 + np.cos(x) ** 2
"""
end
two(x) = py"one"(x) + py"one"(x)
end
=#
调用Python包
在调用Python包之前先确定好是否已经在Python环境配置好这些包
1.调用numpy
using PyCall
# 执行多行Python代码来定义函数
py"""
import numpy as np
def sinpi(x):
return np.sin(np.pi * x)
"""
# 调用刚才定义的Python函数
result = py"sinpi(1)"
# 显示结果
println(result)
#=
旧版本代码
py"""
import numpy as np
def sinpi(x):
return np.sin(np.pi * x)
"""
py"sinpi"(1)
=#
2.调用scipy
using PyCall
so = pyimport("scipy.optimize")
julia_func(x) = cos(x) - x
root = so.newton(julia_func, 1.0)
println(root)
#=
旧版本代码
so = pyimport("scipy.optimize")
so.newton(x -> cos(x) - x, 1)
=#
3.调用matplotlib
using PyCall
plt = pyimport("matplotlib.pyplot")
x = range(0, stop=2*pi, length=1000)
y = sin.(3*x .+ 4*cos.(2*x))
plt.plot(x, y, color="red", linewidth=2.0, linestyle="--")
plt.show()
#=
旧版本代码
plt = pyimport("matplotlib.pyplot")
x = range(0;stop=2*pi,length=1000); y = sin.(3*x + 4*cos.(2*x));
plt.plot(x, y, color="red", linewidth=2.0, linestyle="--")
plt.show()
=#