计算化学公社

 找回密码 Forget password
 注册 Register
Views: 91|回复 Reply: 1
打印 Print 上一主题 Last thread 下一主题 Next thread

[ORCA] ORCA 6.1.1 win64版自动化执行python脚本

[复制链接 Copy URL]

12

帖子

0

威望

289

eV
积分
301

Level 3 能力者

       最近闲来无事安装了最新版的win版本的ORCA:Orca.6.1.1.Win64_msmpi.zip(安装很简单,论坛就有往期版本安装的教程量子化学程序ORCA的安装方法 - 量子化学 (Quantum Chemistry) - 计算化学公社)尽管可以通过cmd等提交任务,如:D:\study\ORCA_6.0.0\orca H2CO.inp > H2CO.out,或者使用:"在Windows下使用ORCA的最便捷方法" 安装cmder来调用ORCA(这个方法本人暂时还没上手)
       本人图省事用deepseek写了一个脚本(我基本不懂脚本,只是尝试后能用,特来分享记录)来自动化运行inp文件,并将结果输入到out文件中,py脚本内容如下,可自行复制到txt文件中,并把文件后缀改成py,双击之后便可自动执行(安装脚本之前要安装python,我的python 3.14,并把路径改成实际自己的路径,另外ORCA最好直接安装在D盘(或其他盘)下,如D:\ORCA611,装在子文件夹会报错(原因暂不明)):


       脚本说明:双击脚本会自动依次执行同文件目录下的inp文件(执行时会弹出cmd命令框,执行完成或报错会在命令框提醒,关闭cmd命令框可杀掉任务),亦可遍历子文件夹中的inp文件并执行(拆分文件夹执行会更好,有条理,也避免报错)。


文件暂时无法上传,脚本如下,欢迎大佬提出意见优化脚本:

import os
import subprocess
import sys
from pathlib import Path

# ================= 配置(请务必修改) =================
ORCA_EXE = r"D:\ORCA611\orca.exe"   # 改成你的实际路径
# =====================================================

def find_inp_files(root_dir):
    inp_files = []
    for dirpath, _, filenames in os.walk(root_dir):
        for fname in filenames:
            if fname.lower().endswith(".inp"):
                inp_files.append(Path(dirpath) / fname)
    return inp_files

def run_orca(inp_path, original_cwd):
    work_dir = inp_path.parent
    inp_name = inp_path.name
    out_name = inp_path.stem + ".out"
    out_path = work_dir / out_name

    print(f"\n{'='*60}")
    print(f"输入文件: {inp_path}")
    print(f"工作目录: {work_dir}")

    # 检查输入文件
    if not inp_path.exists():
        print("❌ 输入文件不存在,跳过")
        return

    # 检查ORCA可执行文件
    orca_path = Path(ORCA_EXE)
    if not orca_path.exists():
        print(f"❌ 找不到ORCA程序:{ORCA_EXE}")
        print("   请确认路径和文件名是否正确。")
        return

    # 切换工作目录
    try:
        os.chdir(work_dir)
    except Exception as e:
        print(f"❌ 无法进入目录 {work_dir}:{e}")
        return

    # 构建命令(绝对路径调用ORCA,输入文件用相对路径)
    cmd = f'"{orca_path}" {inp_name} > "{out_name}" 2>&1'
    print(f"执行命令:{cmd}")

    try:
        result = subprocess.run(cmd, shell=True, check=False, capture_output=True, text=True)
        if result.returncode == 0:
            print(f"✅ 计算成功!输出文件:{out_path}")
        else:
            print(f"❌ 计算失败,返回码:{result.returncode}")
            if result.stderr:
                print("错误信息(前500字符):")
                print(result.stderr[:500])
            # 若输出文件存在,打印最后几行辅助诊断
            if out_path.exists():
                with open(out_path, 'r', encoding='utf-8', errors='ignore') as f:
                    lines = f.readlines()
                    if lines:
                        print("输出文件最后10行:")
                        print(''.join(lines[-10:]))
    except Exception as e:
        print(f"❌ 运行异常:{e}")
    finally:
        os.chdir(original_cwd)   # 恢复原始目录

def main():
    original_cwd = os.getcwd()
    root_dir = Path.cwd()   # 脚本所在目录,或改为你的总文件夹路径

    print(f"扫描根目录:{root_dir}")
    inp_files = find_inp_files(root_dir)

    if not inp_files:
        print("未找到任何 .inp 文件。")
        input("按 Enter 退出...")
        return

    print(f"找到 {len(inp_files)} 个 .inp 文件:")
    for f in inp_files:
        print(f"  - {f}")

    for inp_path in inp_files:
        run_orca(inp_path, original_cwd)

    print("\n所有任务处理完毕。")
    input("按 Enter 退出...")   # 防止闪退

if __name__ == "__main__":
    main()





167

帖子

0

威望

1180

eV
积分
1347

Level 4 (黑子)

2#
发表于 Post on yesterday 15:18 | 只看该作者 Only view this author
少了个检测机制,检查inp目录下有没有同名的out,避免重复计算。
你都做到这一步了,干脆在根目录下做个详细的记录报告,记录inp的计算类型,计算结果,成功与否。
切换路径那里可以用subprocess.run(..., cwd=work_dir)替代,不然的话你整个python进程就是在频繁进出文件,后续如果涉及到并行之类的就容易崩溃。

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2026-8-25 09:50 , Processed in 0.219160 second(s), 21 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list