64位PySide6程序调用32位Python脚本操作Access数据库的方案咨询
解决方案:64位PySide6程序调用32位Python处理Access数据库写入
核心结论
不能直接在64位PySide6程序中导入并调用32位Python编写的Access.py函数——64位与32位Python属于不同架构,内存空间不兼容,无法跨架构加载模块或执行代码。必须通过跨进程通信的方式实现调用。
可行方案:通过subprocess调用32位Python脚本
将Access.py改造为可独立运行的脚本,接收外部传入的数据;在64位PySide6程序中,用subprocess模块启动32位Python解释器执行该脚本,完成数据库写入操作。
步骤1:改造32位Access.py脚本
修改脚本,使其支持从命令行接收JSON格式的参数,并返回执行结果:
import pyodbc import sys import json def WriteData(mailFrom, mailTo, mailSubject, mailMessage, format): # 数据库连接与写入逻辑保持不变 conn = pyodbc.connect(r'Driver={Microsoft Access Driver (*.mdb)};DBQ=\\strvltstorage.av.ge.com\st001dataaege\siteapps\WINAPPS\SendMail\SendMail.mdb;') cursor = conn.cursor() new_entry = (mailFrom, mailTo, mailSubject, mailMessage, format) cursor.execute("INSERT INTO MailTable (Mail_From, Mail_To, Mail_Subject, Mail_Body, Mail_Format) VALUES (?, ?, ?, ?, ?)", new_entry) conn.commit() conn.close() return "Data entry added successfully." if __name__ == "__main__": # 从命令行参数读取JSON数据 if len(sys.argv) > 1: try: data = json.loads(sys.argv[1]) result = WriteData(**data) print(json.dumps({"result": result})) except Exception as e: print(json.dumps({"error": str(e)})) else: print(json.dumps({"error": "No input data provided"}))
步骤2:修改64位PySide6程序
在PySide6代码中,通过subprocess调用32位Python解释器执行改造后的Access.py:
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget import sys import subprocess import json import os class HelloWorldApp(QMainWindow): def __init__(self): super().__init__() central_widget = QWidget(self) self.setCentralWidget(central_widget) layout = QVBoxLayout(central_widget) self.button = QPushButton('Click me!', self) self.button.clicked.connect(self.writeData) layout.addWidget(self.button) # 指定32位Python解释器路径(需根据实际安装路径调整) self.python_32_path = r"C:\Python39-32\python.exe" # 获取Access.py脚本的绝对路径 self.access_script = os.path.abspath(os.path.join(os.path.dirname(__file__), "Access.py")) def writeData(self): # 准备要写入的数据 input_data = { "mailFrom": "it.strother@domain.com", "mailTo": "luke@domain.com", "mailSubject": "From Python", "mailMessage": "Sending from python", "format": "text" } # 序列化为JSON字符串传递 data_json = json.dumps(input_data) try: # 启动32位Python进程执行脚本 proc = subprocess.run( [self.python_32_path, self.access_script, data_json], capture_output=True, text=True, check=True ) # 解析脚本返回的结果 output = json.loads(proc.stdout) if "result" in output: print(output["result"]) else: print(f"写入失败: {output.get('error', '未知错误')}") except subprocess.CalledProcessError as e: print(f"脚本执行出错: {e.stderr}") except Exception as e: print(f"调用失败: {str(e)}") if __name__ == "__main__": app = QApplication(sys.argv) main_window = HelloWorldApp() main_window.show() sys.exit(app.exec())
部署注意事项
- 32位Python路径:需根据目标机器上32位Python的实际安装路径调整
python_32_path,若要避免依赖目标机器的Python环境,可将32位Python与脚本一起打包为独立EXE(使用PyInstaller的32位版本)。 - 网络驱动器权限:确保32位Python进程拥有访问共享数据库路径的权限。
- 错误处理:代码中已包含基础错误捕获,可根据需求扩展日志记录或UI提示逻辑。
内容的提问来源于stack exchange,提问作者user23346328
相关产品推荐
相关产品推荐

