Python项目环境适配求助:SharePoint与Oracle跨32/64位兼容问题
一、跨位数Python环境的可靠运行方案
32位和64位Python的编译架构不同,模块无法直接互相导入,必须通过进程隔离或服务化调用实现协作:
1. 独立脚本+子进程调用
把Oracle和SharePoint的逻辑拆成独立脚本,主脚本通过subprocess调用对应位数的Python解释器执行,用JSON或临时文件传递数据:
- 主脚本调用示例:
import subprocess import json # 替换成你的32位/64位Python路径 python_32 = r"C:\Python38-32\python.exe" python_64 = r"C:\Python38\python.exe" # 调用32位Oracle脚本获取数据 oracle_result = subprocess.run( [python_32, "oracle_service.py", "--query", "SELECT * FROM user_table"], capture_output=True, text=True ) if oracle_result.returncode == 0: oracle_data = json.loads(oracle_result.stdout) else: print(f"Oracle执行出错: {oracle_result.stderr}") # 调用64位SharePoint脚本获取数据 sp_result = subprocess.run( [python_64, "sharepoint_service.py", "--list-id", "your-list-guid"], capture_output=True, text=True ) if sp_result.returncode == 0: sp_data = json.loads(sp_result.stdout) else: print(f"SharePoint执行出错: {sp_result.stderr}")
- 子脚本示例(
oracle_service.py):
import sys import json from oracle import OracleCon def main(): query = sys.argv[2] con = OracleCon() data = con.fetch_data(query) print(json.dumps(data)) if __name__ == "__main__": main()
2. 本地轻量API服务
把两个功能做成独立的Flask/FastAPI服务,运行在不同端口,主脚本通过HTTP请求调用:
- 32位Oracle服务(
oracle_api.py):
from flask import Flask, request, jsonify from oracle import OracleCon app = Flask(__name__) db_con = OracleCon() @app.route("/fetch", methods=["POST"]) def fetch_oracle(): query = request.json.get("query") data = db_con.execute(query) return jsonify(data) if __name__ == "__main__": app.run(port=5000, debug=False)
- 64位SharePoint服务(
sharepoint_api.py):
from flask import Flask, request, jsonify from sharepoint import SharePointCon app = Flask(__name__) sp_con = SharePointCon() @app.route("/get-list", methods=["GET"]) def get_sp_list(): list_id = request.args.get("list-id") data = sp_con.get_items(list_id) return jsonify(data) if __name__ == "__main__": app.run(port=5001, debug=False)
- 主脚本调用:
import requests # 获取Oracle数据 oracle_res = requests.post("http://localhost:5000/fetch", json={"query": "SELECT * FROM table"}) oracle_data = oracle_res.json() # 获取SharePoint数据 sp_res = requests.get("http://localhost:5001/get-list", params={"list-id": "your-guid"}) sp_data = sp_res.json()
二、32位Python连接SharePoint的可行方法
放弃依赖位数的OLEDB驱动,改用跨位数兼容的REST API或专用库:
1. 直接调用SharePoint REST API
通过HTTP请求操作SharePoint,无需额外驱动,32/64位通用:
import requests from requests_ntlm import HttpNtlmAuth # 针对On-Premises版本,Online用OAuth2 site_url = "https://your-sharepoint-site.com/sites/team-site" list_id = "your-list-guid" api_endpoint = f"{site_url}/_api/web/lists(guid'{list_id}')/items" # NTLM认证(根据你的环境调整,比如Online用azure-identity) auth = HttpNtlmAuth("domain\\username", "your-password") headers = {"Accept": "application/json;odata=verbose"} response = requests.get(api_endpoint, auth=auth, headers=headers) if response.status_code == 200: items = response.json()["d"]["results"] for item in items: print(item["Title"]) # 替换成你的列表字段 else: print(f"请求失败: {response.status_code} - {response.text}")
2. 使用shareplum库(32位兼容)
专门封装SharePoint操作的Python库,基于REST API,无需OLEDB:
- 安装:
pip install shareplum - 示例代码:
from shareplum import Site from shareplum.site import Version # 连接SharePoint站点 site = Site( "https://your-sharepoint-site.com/sites/team-site", version=Version.v365, # 根据版本选v2013/v2016/v365 auth=("domain\\username", "your-password") ) # 获取列表数据 sp_list = site.List("你的列表名称") items = sp_list.GetListItems() # 处理数据 for item in items: print(item.get("Title"))
内容的提问来源于stack exchange,提问作者jgabriel
相关产品推荐
相关产品推荐

