使用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()
错误原因
- Java路径未被识别:系统环境变量PATH中未包含Java的bin目录,subprocess无法定位
java.exe。 - 相对路径解析错误:脚本的当前工作目录与预期不符,导致找不到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
相关产品推荐
相关产品推荐

