# Python 调用 Julia
本文介绍如何使用 Python 调用 Julia。
# 1. 概述
# 目的
- 无需安装其它任何环境,在 Syslab 上能够实现 Python 编程及 Python 调用 Julia 库函数;
- 按照本文提供的 Python 环境切换方法,能够实现在用户指定的 Python 环境中调用 Julia 库函数。
# 安装准备
- 安装 Syslab
- 示例:
<Syslab安装路径>/Examples/09 Interfaces/PythonCallJulia: Python 调用同元库函数的示例集<Syslab安装路径>/Examples/09 Interfaces/PythonCallJulia/01-SignalProcessing/07-SignalProcessing-example07.py:Python 调用同元库函数的示例
# 2. 使用 Syslab 提供的 Python 环境
# 环境配置
Syslab 提供了一套完备的 Python 环境,包含同元函数库及第三方依赖包、以及 Python 环境及扩展包等,做到“环境隔离、开箱即用”。
启动 Syslab,打开示例文件
07-SignalProcessing-example07.py,如下图所示:
单击右下角,弹出选择框,如下图所示:

选择 Syslab 提供的 Python 解释器,否则运行会报错。

# 测试验证
上述配置确认(或配置完成后),单击运行按钮,将执行 Python 文件:
# 3. 使用用户指定的 Python 环境
# 安装 Python3
要求安装 python 3.7 以上版本,如 python 3.9.7。其中 python 3.10 以上版本需要安装 PyQt5 5.15.11、scipy 1.7.3。
# 安装 Python 依赖库
安装 Python 依赖库
在 Python 环境切换之前,请确认以下 Python 扩展包是否已安装。
注,下面
python指的是用户的 Python 环境。# 查看pip安装的所有包 python -m pip list # matplotlib==3.7.5(Win10/11建议安装3.7.5,Win7建议安装3.5.0,其余版本未经测试) python -m pip install matplotlib==3.7.5 # pyqt==5.15.11【Windows】 python -m pip install PyQt5==5.15.11 # pyqt==5.14.2【Linux】 python -m pip install PyQt5==5.14.2 # dill python -m pip install dill # wordcloud python -m pip install wordcloud # reportlab python -m pip install reportlab # requests==2.31.0 python -m pip install requests==2.31.0 # 【地理图】 python -m pip install basemap python -m pip install folium # pywin32【windows独有】 python -m pip install pywin32 # 【实时编辑器】 python -m pip install ipykernel # 【app服务化】 python -m pip install aiohttp python -m pip install loguru # scipy 1.7 及以上版本(Win10/11/Linux建议安装1.11,Win7建议安装1.7.3) python -m pip install scipy==1.11.4 # sympy 1.9及以上版本 python -m pip install sympy==1.9 # tomli 2.0.1及以上版本 python -m pip install tomli安装同元扩展包
# 方法2:通过源上安装 # python -m pip install julia-numpy==0.4.9 # 安装tyjuliacall时自动安装此包 python -m pip install tyjuliacall==0.7.6
# 在 Linux 下切换 Python 环境
# 修改配置
custom-env.sh
在 Linux 环境下,打开
<Syslab安装目录>/Setting/custom-env.sh文件。其中,若环境变量TY_PYTHON_EXE存在且不为空,则使用用户的 Python 环境,否则使用 Syslab 提供的 Python 环境。原始脚本如下,默认为同元 python 环境:
#!/bin/bash # Syslab installation path dirname=`dirname "$0"` SYSLAB_HOME="$dirname"/../ # User's python environment (needs to be modified): # export TY_PYTHON_EXE="/usr/local/python3.9.7/bin/python3" # export LD_LIBRARY_PATH=/usr/local/python3.9.7/lib:$LD_LIBRARY_PATH # export PATH=/usr/local/python3.9.7/bin:$PATH # ================================================================== # activate Syslab environment source "$SYSLAB_HOME/Setting/syslab-env.sh" $SYSLAB_HOME设置用户的 python 环境并解注释:
#!/bin/bash # Syslab installation path dirname=`dirname "$0"` SYSLAB_HOME="$dirname"/../ # User's python environment (needs to be modified): export TY_PYTHON_EXE="/usr/local/python3.9.7/bin/python3" # export LD_LIBRARY_PATH=/usr/local/python3.9.7/lib:$LD_LIBRARY_PATH # export PATH=/usr/local/python3.9.7/bin:$PATH # ================================================================== # activate Syslab environment source "$SYSLAB_HOME/Setting/syslab-env.sh" $SYSLAB_HOMEsyslab-env.sh:即
<Syslab安装目录>/Setting/syslab-env.sh,此脚本无需修改;将
<Syslab安装目录>/.julia/miniforge3/lib/python3.11/site-packages/mworks文件夹拷贝至用户 Python 环境下,如/usr/local/python3.9.7/lib/python3.9/site-packages/。
# 测试验证
上述配置修改完毕后,首先需要让custom-env.sh生效,然后才能使用用户的 Python。如下所示:
# 设置环境变量
cd <Syslab 安装目录>/Setting
source custom-env.sh
# 启动Python,运行示例文件`07-SignalProcessing-example07.py`,如下图所示:
07-SignalProcessing-example07.py的示例代码,如下所示。
from mworks import TySignalProcessing
from matplotlib import pyplot as plt
import numpy as np
fs = 100
t = np.arange(fs + 1) / fs
print(t)
x = np.sin(2 * np.pi * t*3) + 0.25*np.sin(2 * np.pi * t*40)
# 调用信号库函数
y = TySignalProcessing.medfilt1(x, 9)
# 调用图形库函数
plt.plot(t, x, t, y)
plt.legend(np.asarray(["Original", "Filtered"]))
plt.show()
# 在 Windows 下切换 Python 环境
# 在用户的 Python 环境中运行
修改配置
新建一个
custom-env.bat批处理文件,内容如下。其中,有一处需要根据实际情况修改:一是用户的 Python 环境,即设置
TY_PYTHON_EXE;REM User python environment (needs to be modified) set TY_PYTHON_EXE=C:/Python39/python.exe REM julia install path set JULIA_HOME=C:/Users/Public/TongYuan/julia-1.10.10 @echo off REM julia depot path (can be modified) if "%TY_DEPOT_PATH%"=="" (goto syslab_depot) else (goto custom_depot) :syslab_depot set JULIA_DEPOT_PATH=C:/Users/Public/TongYuan/.julia goto syslab_depot_end :custom_depot set JULIA_DEPOT_PATH=%TY_DEPOT_PATH% goto syslab_depot_end :syslab_depot_end REM Syslab conda path (can be modified) set TY_CONDA3=%JULIA_DEPOT_PATH%/miniforge3 REM ============================================= set SYSLAB_JL_PATH=%JULIA_HOME%/bin;%JULIA_HOME%/lib;%JULIA_HOME%/lib/julia set KMP_DUPLICATE_LIB_OK=TRUE set JULIA_CONDAPKG_BACKEND=Null set PYTHON_JULIAPKG_OFFLINE=yes set JULIA_PYTHONCALL_EXE=@PyCall set TYPY_JL_EXE=%JULIA_HOME%/bin/julia.exe if "%TY_PYTHON_EXE%"=="" (goto syslab_python) else (goto custom_python) :syslab_python REM Syslab python environment set PYTHON_HOME= set QT_QPA_PLATFORM_PLUGIN_PATH= set PYTHON=%TY_CONDA3%/python.exe set PATH=%SYSLAB_JL_PATH%;%TY_CONDA3%;%TY_CONDA3%/Library/mingw-w64/bin;%TY_CONDA3%/Library/usr/bin;%TY_CONDA3%/Library/bin;%TY_CONDA3%/Scripts;%TY_CONDA3%/bin;%PATH% goto syslab_python_end :custom_python REM User python environment set PYTHON=%TY_PYTHON_EXE% set PATH=%SYSLAB_JL_PATH%;%PATH% goto syslab_python_end :syslab_python_end REM ============================================= @echo on REM start powershell powershell将
C:/Users/Public/TongYuan/.julia/miniforge3/Lib/site-packages/mworks文件夹拷贝至用户 Python 环境下,如C:/Python39/Lib/site-packages/。
测试验证
双击
custom-env.bat后,打开 powershell,启动 Python,运行示例07-SignalProcessing-example07.py,结果如下:
# 在 Pycharm 环境中运行
修改配置
新建一个
pycharm-env.bat批处理文件,内容如下。其中,有两处需要根据实际情况修改:若使用用户的 Python 环境,请设置
TY_PYTHON_EXE;若使用 Syslab 提供的 Python 环境,请取消设置
TY_PYTHON_EXE。PyCharm 的安装路径;
REM User python environment (needs to be modified) set TY_PYTHON_EXE=C:/Python39/python.exe REM julia install path set JULIA_HOME=C:/Users/Public/TongYuan/julia-1.10.10 @echo off REM julia depot path (can be modified) if "%TY_DEPOT_PATH%"=="" (goto syslab_depot) else (goto custom_depot) :syslab_depot set JULIA_DEPOT_PATH=C:/Users/Public/TongYuan/.julia goto syslab_depot_end :custom_depot set JULIA_DEPOT_PATH=%TY_DEPOT_PATH% goto syslab_depot_end :syslab_depot_end REM Syslab conda path (can be modified) set TY_CONDA3=%JULIA_DEPOT_PATH%/miniforge3 REM ============================================= set SYSLAB_JL_PATH=%JULIA_HOME%/bin;%JULIA_HOME%/lib;%JULIA_HOME%/lib/julia set KMP_DUPLICATE_LIB_OK=TRUE set JULIA_CONDAPKG_BACKEND=Null set PYTHON_JULIAPKG_OFFLINE=yes set JULIA_PYTHONCALL_EXE=@PyCall set TYPY_JL_EXE=%JULIA_HOME%/bin/julia.exe if "%TY_PYTHON_EXE%"=="" (goto syslab_python) else (goto custom_python) :syslab_python REM Syslab python environment set PYTHON_HOME= set QT_QPA_PLATFORM_PLUGIN_PATH= set PYTHON=%TY_CONDA3%/python.exe set PATH=%SYSLAB_JL_PATH%;%TY_CONDA3%;%TY_CONDA3%/Library/mingw-w64/bin;%TY_CONDA3%/Library/usr/bin;%TY_CONDA3%/Library/bin;%TY_CONDA3%/Scripts;%TY_CONDA3%/bin;%PATH% goto syslab_python_end :custom_python REM User python environment set PYTHON=%TY_PYTHON_EXE% set PATH=%SYSLAB_JL_PATH%;%PATH% goto syslab_python_end :syslab_python_end REM ============================================= @echo on REM pycharm (needs to be modified) start /B "" "D:/Program Files/JetBrains/PyCharm Community Edition 2022.1/bin/pycharm64.exe"将
C:/Users/Public/TongYuan/.julia/miniforge3/Lib/site-packages/mworks文件夹拷贝至用户 Python 环境下,如C:/Python39/Lib/site-packages/。
测试验证
双击
pycharm-env.bat后,打开 Pycharm,运行示例07-SignalProcessing-example07.py,结果如下:注,Pycharm 中的 Python 解释器,要求已安装前面所述的 Python依赖库。

# 4. 常用示例
# 信号处理示例
调频正弦波与语音信号的带状图可视化。针对调制正弦波,指定采样频率与时间条带,绘制两秒调频正弦波;针对语言信号,加载录音文件,指定采样频率与时间条带,绘制垂直轴缩放可视化音频。
from mworks import TySignalProcessing
import os
import numpy as np
from matplotlib import pyplot as plt
from scipy.io import loadmat
# 示例1:调频正弦曲线的条形图
# 在 0.25 秒的条带中绘制两秒的调频正弦波。指定 1 kHz 的采样率。
fs = 1000
t = (np.arange(0, 2.000001, 1 / fs)).reshape(-1, 1)
x = TySignalProcessing.vco(np.sin(2 * np.pi * t), np.array([10, 490]), fs)
TySignalProcessing.strips(x, 0.25, fs)
# 示例2:语音信号的条形图
# 加载以 Fs =7418Hz 采样的语音信号。
current_dir = os.path.dirname(os.path.abspath(__file__))
file_path = os.path.join(current_dir, "mtlb.mat")
y = loadmat(file_path)
# 在 0.18 秒长的条带中绘制该信号。
mtlb = y["mtlb"]
Fs = int(y["Fs"][0][0])
TySignalProcessing.strips(mtlb, 0.18, Fs)
plt.show()
# DSP 系统示例
使用级联积分组合滤波器进行信号插值。创建正弦信号,指定采样率与数据帧长度,级联积分组合滤波器输出指定增益值下的放大信号。为了更好与原始信号的振幅一致,动态计算增益以使得处理信号与原信号匹配。
from mworks import TyDSPSystem
from mworks import TyCommunication
import numpy as np
from matplotlib import pyplot as plt
# 示例1:使用级联积分组合滤波器进行信号插值
cicint = TyDSPSystem.dsp_CICInterpolator(InterpolationFactor = 2)
# 创建一个 dsp_SineWave 对象,采样率设置为 22.05 kHz,SamplesPerFrame 设置为 32,OutputDataType 设置为 "Custom"。
Fs = 22.05e3
sine = TyDSPSystem.dsp_SineWave( \
Frequency = 1050, \
SampleRate = Fs, \
SamplesPerFrame = 32, \
Method = "Table lookup", \
OutputDataType = "Custom" \
)
# CIC 插值滤波器的输出被一个特定的增益值所放大。你可以使用增益功能来确定这个值。
x = TyCommunication.step(sine)
y = TyCommunication.step(cicint, x)
gainCIC = TyDSPSystem.gain(cicint)
# 为了调整这个放大的输出并使其与原始信号的振幅相匹配,用计算出的增益值除以 CIC 插值信号。
# 比较原始信号和插值信号。在绘图的时候,要考虑到 2 个样本的输出延时。
n = np.arange(0, 64, 1).ravel()
stem1 = plt.stem(n[0:31] / Fs, (x[0:31]), basefmt='k')
stem1.stemlines.set_linewidth(0.5)
stem1.baseline.set_linewidth(0.5)
stem1.markerline.set_markeredgewidth(0.5)
I = cicint.InterpolationFactor
stem2 = plt.stem(n[0:61] / (Fs * I), (y[3:]) / gainCIC, linefmt='r', basefmt='k')
stem2.markerline.set_markerfacecolor("none")
stem2.markerline.set_markeredgecolor("r")
stem2.markerline.set_markeredgewidth(0.5)
stem2.stemlines.set_linewidth(0.5)
stem2.baseline.set_linewidth(0.5)
plt.xlabel("Time (sec)")
plt.ylabel("Signal Amplitude")
plt.legend(np.array(["Original Signal", "Interpolated Signal"]), loc = "upper center")
plt.show()
# 通信示例
线性均衡正交相移键控调制信号。生成正交相移键控(QPSK)调制信号,并对其应用高斯白噪声(AWGN)信道损伤,采用最小均方(LMS)算法使用线性均衡器对受损信号进行均衡,绘制受损和恢复后的均衡信号的星座图及均衡器误差,并计算均衡信号的误差向量幅度(EVM)。
from mworks import TyCommunication
from tyjuliacall import JuliaEvaluator
from tyjuliacall import TyPlot
from tyjuliacall import TyMath
import numpy as np
# 示例1:线性均衡 QPSK 调制信号
# 使用最小均值(LMS)算法进行线性均衡,恢复通过多径 AWGN 信道的 QPSK 符号。
# 初始化仿真变量。
JuliaEvaluator[r'import TyMath; TyMath.Random.seed!(1234)']
M = 4
numSymbols = 10000
numTrainSymbols = 1000
chtaps = (np.array([1, 0.5 * (np.cos(np.pi / 6) + 1j * np.sin(np.pi / 6)), 0.1 * (np.cos(-np.pi / 8) + 1j * np.sin(-np.pi / 8))])).reshape(1, 3)
# 产生 QPSK 调制的符号。对符号应用多径信道滤波和 AWGN 损伤。
data = TyMath.randi(np.array([0, M - 1]), numSymbols, 1)
tx = TyCommunication.pskmod(data, M, np.pi / 4)
sig, _ = TyMath.filter1(chtaps, 1, tx)
rx = TyCommunication.awgn(sig, 25, "measured")
# 创建一个线性均衡器系统对象并显示默认配置。将参考抽头调整为 1。检查允许的最大步长。对受损的符号进行均衡。
eq = TyCommunication.comm_LinearEqualizer(ReferenceTap = 1)
y, err, weights = TyCommunication.step(eq, rx, tx)
# 绘制受损和均衡符号的星座图。
constell = TyCommunication.comm_ConstellationDiagram( ShowLegend = True, \
ChannelNames = np.array(["Channel1", "Channel2"]), NumInputPorts = 2)
yy = TyCommunication.step(constell, rx, y)
# 绘制均衡器误差信号,并计算均衡符号的误差向量幅度(EVM)。
TyPlot.figure()
TyPlot.plot(np.absolute(err))
TyPlot.xlabel("Symbols")
TyPlot.ylabel("|e|")
TyPlot.title("Equalizer Error Signal")
# 绘制均衡器的分接权重。
TyPlot.figure()
TyPlot.plot(np.absolute(err))
TyPlot.subplot(3, 1, 1)
TyPlot.stem((weights).real)
TyPlot.ylabel("real(weights)")
TyPlot.xlabel("Tap")
TyPlot.grid("on")
TyPlot.axis(np.array([-1, 4, -0.5, 1]))
TyPlot.title("Equalizer Tap Weights")
TyPlot.subplot(3, 1, 2)
TyPlot.stem((weights).imag)
TyPlot.ylabel("imag(weights)")
TyPlot.xlabel("Tap")
TyPlot.grid("on")
TyPlot.axis(np.array([-1, 4, -0.5, 1]))
TyPlot.subplot(3, 1, 3)
TyPlot.stem(np.absolute(weights))
TyPlot.ylabel("abs(weights)")
TyPlot.xlabel("Tap")
TyPlot.grid("on")
TyPlot.axis(np.array([-1, 4, -0.5, 1]))
TyPlot.plt.show()
# 5. 常见问题(FAQ)
# Python 插件选项设置
# Julia 启动时出现 conda activate base
解决办法:将选项 python.terminal.activateEnvironment 设为 false。
# autopep8 自动格式化,改变 import 顺序问题
解决办法:
- 方法 1:打开设置,输入
python.formatting.autopep8Args,添加["--ignore", "E402"],让 autopep8 忽略 E402,也就是 “模块级别导入不在文件顶部”错误; - 方法 2:在需要固定位置的 import 语句后面加上
# NOQA: E402注释。