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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:07:04