2026a

# 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 环境及扩展包等,做到“环境隔离、开箱即用”。

  1. 启动 Syslab,打开示例文件07-SignalProcessing-example07.py,如下图所示:

  2. 单击右下角,弹出选择框,如下图所示:

  3. 选择 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 依赖库

  1. 安装 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. 安装同元扩展包

    # 方法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_HOME
    
  • syslab-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 环境中运行

  1. 修改配置

    新建一个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/

  2. 测试验证

    双击custom-env.bat后,打开 powershell,启动 Python,运行示例07-SignalProcessing-example07.py,结果如下:

# 在 Pycharm 环境中运行

  1. 修改配置

    新建一个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/

  2. 测试验证

    双击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 注释。

# 6. 参考文献