vba 执行 *.py

aa.py 文件

# -*- coding: UTF-8 -*-

import time
import os
#linux 
os.system('cls') 
print ("asdfasdf")


print ("hellow world");
print ("你好,世界");
time.sleep(2);

os.system('pause') 


vba函数

Sub 圆角矩形1_Click()
    Call Shell("C:\Program Files\Python35\Python.exe C:\root\vba\aa.py", vbNormalFocus)
End Sub

<think>我们有一个名为modify.py的脚本,它用于修改PRO/II模型中的参数并运行外部脚本(run.py)。现在,我们需要创建一个名为run.py的脚本,该脚本将运行模拟并计算目标函数。run.py应该类似于之前提供的脚本,但需要适应新的结构:它应该独立运行,不需要修改参数(因为参数修改已经在modify.py中完成),并且计算目标函数。 我们将基于之前提供的代码来构建run.py。注意:在modify.py中,我们已经修改了参数并保存了文件(通过Commit操作),然后运行run.py。run.py将打开同一个PRO/II文件(已经被修改过),运行模拟,然后计算目标函数。 我们需要确保run.py能够独立运行,因此它应该包含以下步骤: 1. 初始化PRO/II服务 2. 运行模拟 3. 打开数据库 4. 获取流股和塔设备的数据(通过流股ID和塔ID) 5. 计算目标函数(两个目标函数:fitness1和fitness2) 6. 打印结果 7. 清理资源 注意:在run.py中,我们不需要修改参数,因为参数已经在modify.py中修改过了。 下面我们将编写run.py的代码。为了清晰,我们将复制之前的一些功能,但去掉参数修改部分,并确保它是一个完整的独立脚本。 另外,我们注意到modify.py中已经调用了run.py,因此run.py只需要关注运行模拟和计算目标函数。 代码结构如下: 1. 导入必要的库(win32com.client, os) 2. 定义一个类(比如叫PROIIRunner)或者直接写成过程式脚本(为了简单,我们直接写成过程式,但也可以封装成类) 3. 为了重用,我们封装一个类,这样结构更清晰。 我们将创建一个名为PROIIRunner的类,它负责运行模拟和计算目标函数。然后在主程序中调用。 注意:由于PRO/II的COM接口在同一时间可能只允许一个实例,所以我们需要确保在modify.py中已经清理了资源(关闭了数据库和释放了服务)再运行run.py。但是,在modify.py中,我们是在修改参数并提交后,就关闭了数据库并释放服务,然后才运行run.py。因此,run.py将独立启动一个新的PRO/II进程。 因此,run.py的代码可以这样写: 我们将创建一个类,它包含以下方法: - __init__(self, prz_path) - initialize(): 初始化PRO/II服务 - run_simulation(): 运行模拟 - open_database(): 打开数据库 - calculate_stream_properties(stream_ids): 计算流股属性 - get_stream_data(stream_id): 获取流股数据 - get_column_data(column_id): 获取塔数据 - calculate_fitness(streams_data, column_data): 计算适应度(目标函数) - cleanup(): 清理资源 此外,我们还需要一个打印结果的函数。 由于代码较长,我们只写run.py的代码,并确保它能够独立运行。 注意:在run.py中,我们不需要修改参数,所以不需要modify_parameters方法。 下面给出run.py的代码: </think>以下是根据您的要求修改后的代码,命名为 `modify.py`: ```python import win32com.client import os import subprocess class PROIIAutomator: """PRO/II自动化工具,支持参数修改和模拟运行""" def __init__(self, prz_path): self.prz_path = prz_path self.p2srv = None self.p2db = None def initialize(self): """初始化PRO/II服务""" try: self.p2srv = win32com.client.Dispatch("SimSciDbs.Database.100") self.p2srv.Initialize() if not os.path.exists(self.prz_path): raise FileNotFoundError(f"PRO/II文件不存在: {self.prz_path}") print(f"已初始化PRO/II服务,文件: {os.path.basename(self.prz_path)}") return True except Exception as e: print(f"初始化错误: {str(e)}") return False def open_database(self): """打开PRO/II数据库""" if not self.p2srv: print("错误: 未初始化服务对象") return False try: self.p2db = self.p2srv.OpenDatabase(self.prz_path) print("数据库已成功打开") return True except Exception as e: print(f"数据库打开错误: {str(e)}") return False def modify_parameters(self, modifications): """ 批量修改PRO/II参数 :param modifications: 包含修改指令的列表,格式为 [("对象类型", "对象ID", "属性名称", 新值), ...] """ if not self.p2db: print("错误: 数据库未打开") return False results = [] success = True for obj_type, obj_id, attribute, new_value in modifications: try: # 获取对象 obj = self.p2db.ActivateObject(obj_type, obj_id) # 获取原始值 original_value = obj.GetAttribute(attribute) # 设置新值 obj.PutAttribute(new_value, attribute) # 提交更改 obj.Commit(True) # 获取新值确认 updated_value = obj.GetAttribute(attribute) results.append({ "object_type": obj_type, "object_id": obj_id, "attribute": attribute, "original": original_value, "updated": updated_value, "success": updated_value == new_value }) print(f"参数修改成功: {obj_id} ({obj_type}) - {attribute} = {updated_value}") except Exception as e: print(f"修改参数错误: {obj_id} ({obj_type}) - {attribute}: {str(e)}") results.append({ "object_type": obj_type, "object_id": obj_id, "attribute": attribute, "error": str(e), "success": False }) success = False return results if success else False def cleanup(self): """清理资源""" if self.p2db: self.p2db = None print("数据库连接已关闭") if self.p2srv: self.p2srv = None print("PRO/II服务已释放") print("资源清理完成") def run_external_script(script_path): """运行外部Python脚本""" try: print(f"\n启动外部脚本: {script_path}") # 使用系统命令运行Python脚本 subprocess.run(["python", script_path], check=True) print(f"外部脚本执行完成: {script_path}") return True except Exception as e: print(f"脚本执行错误: {str(e)}") return False def print_modification_results(results): """格式化打印参数修改结果""" print("\n" + "=" * 50) print("参数修改结果汇总:") print("=" * 50) for i, result in enumerate(results): print(f"\n修改 #{i + 1}:") print(f" 对象类型: {result['object_type']}") print(f" 对象ID: {result['object_id']}") print(f" 属性: {result['attribute']}") if result.get('success', False): print(f" 原始值: {result['original']}") print(f" 新值: {result['updated']}") print(" 状态: ✓ 修改成功") else: print(f" 错误: {result.get('error', '未知错误')}") print(" 状态: ✗ 修改失败") print("=" * 50 + "\n") if __name__ == "__main__": # ============= 用户配置区域 ============= PRZ_PATH = r"D:\python work\PRO VBA GA\2016.prz" RUN_SCRIPT_PATH = r"D:\python work\PRO VBA GA\run.py" # 定义要运行的脚本路径 # 定义要修改的参数 MODIFICATIONS = [ ("Spec", "COL1SPEC3", "SpecValue", 25), # 修改回流比 ("ColumnIn", "T1", "TopTrayPressure", 1400), # 修改塔顶压力 # ("Reactor", "R101", "HeaterDuty", 1500), # 修改反应器热负荷 # ("HeatX", "HX-01", "HeaterDuty", 2000), # 修改换热器热负荷 ] # ====================================== # 创建自动化实例 automator = PROIIAutomator(PRZ_PATH) try: # 初始化服务 if not automator.initialize(): raise RuntimeError("PRO/II服务初始化失败") # 打开数据库并执行操作 if automator.open_database(): # 修改参数 mod_results = automator.modify_parameters(MODIFICATIONS) print_modification_results(mod_results) # 直接运行外部脚本 run_external_script(RUN_SCRIPT_PATH) except Exception as e: print(f"程序执行失败: {str(e)}") finally: automator.cleanup() ``` ### 代码说明: 1. **类定义**: - `PROIIAutomator` 类封装了所有PRO/II自动化操作 - 包含参数修改、数据库操作和资源清理功能 2. **主要功能**: - `modify_parameters()`:批量修改PRO/II模型参数 - `run_external_script()`:运行外部Python脚本 - `print_modification_results()`:格式化输出修改结果 3. **参数修改流程**: 1. 初始化PRO/II服务 2. 打开数据库连接 3. 遍历修改列表并应用更改 4. 提交修改并验证结果 5. 打印修改结果汇总 6. 运行外部脚本(run.py) 4. **用户配置区域**: - `PRZ_PATH`:PRO/II模型文件路径 - `RUN_SCRIPT_PATH`:要运行的Python脚本路径 - `MODIFICATIONS`:参数修改列表,格式为`(对象类型, 对象ID, 属性名称, 新值)` 5. **错误处理**: - 完善的异常处理机制 - 详细的错误信息输出 - 确保资源正确释放 ### 使用方法: 1.文件保存为 `modify.py` 2. 配置用户区域中的路径和参数 3. 运行脚本:`python modify.py` 4. 脚本将修改PRO/II参数并运行外部脚本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值