WSL环境下Python3 subprocess调用Python2.7依赖二进制报错求解
场景说明
- 运行环境:Win10 + WSL Ubuntu,主流程为Python3脚本,需调用依赖Python2.7库的老旧二进制程序
martinize,因迁移成本过高未做Python3适配。全程无需单独调用Python2解释器执行代码,仅需通过激活虚拟环境完成二进制程序的依赖加载。 - 手动验证的可运行步骤:
source ../martini_3.0.b.3.2/PythonCrisis/bin/activate ../martini_3.0.b.3.2/martinize -h deactivate
- 异常表现:将上述步骤写入shell脚本后,手动在Ubuntu终端执行无问题,但Python3脚本通过
subprocess调用该shell脚本时,出现报错:
stdout stderr /home/ubuntu/DE_NOVO_PROTEINS/SCRIPTS/martini_shell.sh: 3: source: not found Traceback (most recent call last): File "/home/ubuntu/miniconda3/lib/python3.8/runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File "/home/ubuntu/miniconda3/lib/python3.8/runpy.py", line 87, in _run_code exec(code, run_globals) File "../martini_3.0.b.3.2/martinize/__main__.py", line 3, in <module> File "<frozen zipimport>", line 259, in load_module File "../martini_3.0.b.3.2/martinize/martinize/__init__.py", line 37, in <module> ModuleNotFoundError: No module named 'core' DeprecationWarning: 'source deactivate' is deprecated. Use 'conda deactivate'.
根因
- 核心报错为
source: not found:这是因为shell脚本的首行shebang声明实际为#!/bin/sh,而非预期的#!/bin/bash。 - Ubuntu系统默认将
/bin/sh指向dash shell,dash不支持bash内置的source命令,导致虚拟环境激活步骤直接失败,后续系统无法加载Python2虚拟环境内的依赖库,最终出现ModuleNotFoundError: No module named 'core'的连锁错误。 - 手动在终端执行无问题的原因:交互式终端默认使用bash解释器,执行脚本时未触发shebang指定的dash解释器逻辑,因此可以正常识别
source命令。
解决方案
- 修正shell脚本首行的shebang声明,将
#!/bin/sh修改为#!/bin/bash,保存后重新调用即可。 - 若不想修改脚本文件,也可在Python3的
subprocess调用逻辑中显式指定用bash解释器执行脚本,避免依赖shebang配置:import subprocess result = subprocess.run( ["/bin/bash", "/home/ubuntu/DE_NOVO_PROTEINS/SCRIPTS/martini_shell.sh"], capture_output=True, text=True ) print("stdout", result.stdout) print("stderr", result.stderr) - 可选优化:报错中的
DeprecationWarning: 'source deactivate' is deprecated. Use 'conda deactivate'为conda虚拟环境的弃用提示,不影响核心运行,如需消除可将shell脚本内的deactivate替换为conda deactivate。
内容的提问来源于stack exchange,提问作者Anthony Nash
相关产品推荐
相关产品推荐

