You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python subprocess执行bash命令时遇[WinError 2]文件未找到错误

解决subprocess执行Java命令时的FileNotFoundError问题

在Windows环境下,使用Python的subprocess模块执行调用PaDEL-Descriptor的Java命令时,抛出FileNotFoundError: [WinError 2] The system cannot find the file specified错误。

原代码

def desc_calc():
    bashCommand = "java -Xms2G -Xmx2G -Djava.awt.headless=true -jar ./PaDEL-Descriptor/PaDEL-Descriptor.jar -removesalt -standardizenitro -fingerprints -descriptortypes ./PaDEL-Descriptor/PubchemFingerprinter.xml -dir ./ -file descriptors_output.csv"
    process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
    output, error = process.communicate()

错误原因

  1. Java路径未被识别:系统环境变量PATH中未包含Java的bin目录,subprocess无法定位java.exe。
  2. 相对路径解析错误:脚本的当前工作目录与预期不符,导致找不到PaDEL-Descriptor的jar包或配置文件。

解决方案

1. 指定Java的绝对路径

直接使用java.exe的完整路径,避免依赖环境变量:

def desc_calc():
    # 替换为你本地Java的实际路径
    java_exe = r"C:\Program Files\Java\jdk1.8.0_301\bin\java.exe"
    args = [
        java_exe,
        "-Xms2G",
        "-Xmx2G",
        "-Djava.awt.headless=true",
        "-jar",
        "./PaDEL-Descriptor/PaDEL-Descriptor.jar",
        "-removesalt",
        "-standardizenitro",
        "-fingerprints",
        "-descriptortypes",
        "./PaDEL-Descriptor/PubchemFingerprinter.xml",
        "-dir",
        "./",
        "-file",
        "descriptors_output.csv"
    ]
    process = subprocess.Popen(args, stdout=subprocess.PIPE)
    output, error = process.communicate()

2. 将Java添加到系统PATH

打开系统环境变量设置,找到PATH变量,添加Java的bin目录(例如C:\Program Files\Java\jdk1.8.0_301\bin),保存后重启Python环境即可。

3. 使用绝对路径定位PaDEL文件

通过脚本所在目录生成绝对路径,避免工作目录变化导致的路径错误:

import os

def desc_calc():
    # 获取脚本所在的绝对目录
    script_dir = os.path.dirname(os.path.abspath(__file__))
    # 构建PaDEL相关文件的绝对路径
    jar_path = os.path.join(script_dir, "PaDEL-Descriptor", "PaDEL-Descriptor.jar")
    xml_path = os.path.join(script_dir, "PaDEL-Descriptor", "PubchemFingerprinter.xml")
    output_path = os.path.join(script_dir, "descriptors_output.csv")

    args = [
        "java",
        "-Xms2G",
        "-Xmx2G",
        "-Djava.awt.headless=true",
        "-jar",
        jar_path,
        "-removesalt",
        "-standardizenitro",
        "-fingerprints",
        "-descriptortypes",
        xml_path,
        "-dir",
        script_dir,
        "-file",
        output_path
    ]
    process = subprocess.Popen(args, stdout=subprocess.PIPE)
    output, error = process.communicate()

内容的提问来源于stack exchange,提问作者Owais Tahir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:20:37