Visual Studio 2022中Python代码运行报错及与C#集成求助
问题1:Visual Studio 2022中Python脚本编码错误解决
编码声明与文件保存编码检查
- 确保编码声明放在脚本最开头两行,格式如下:
# -*- coding: utf-8 -*- import fitz # PyMuPDF # ... 其余代码 - 检查VS2022中文件的实际保存编码:
- 打开Python文件后,点击顶部菜单栏「文件」→「高级保存选项」
- 在「编码」下拉菜单中选择「Unicode (UTF-8 无签名)」或「Unicode (UTF-8 带签名)」,点击确定保存。
VS2022 Python环境配置
- 确认项目使用的Python解释器与VSCode一致:
- 右键Python项目→选择「Python环境」
- 在右侧环境窗口中,选择你在VSCode中使用的Python版本(确保该环境已安装所有依赖库:
fitz、openpyxl、python-pptx、python-docx)
问题2:C#项目调用Python函数的两种方案
方案1:使用Python.NET直接调用(交互性强)
步骤:
- Python环境准备:在目标Python环境中安装pythonnet:
pip install pythonnet - C#项目配置:
- 打开C#项目,右键项目→「管理NuGet程序包」,搜索并安装
Python.Runtime包。 - 在C#代码中初始化Python运行时并调用函数:
using Python.Runtime; class Program { static void Main(string[] args) { // 替换为你的Python安装路径下的pythonXX.dll Runtime.PythonDLL = @"C:\Users\<你的用户名>\AppData\Local\Programs\Python\Python311\python311.dll"; PythonEngine.Initialize(); using (Py.GIL()) { // 导入Python脚本模块(确保脚本路径在C#可访问范围内) dynamic module = Py.Import("PythonApp1"); // 调用convert_file_to_text函数,传入目标文件路径 string result = module.convert_file_to_text(@"C:\test.pdf"); // 处理返回的文本结果 Console.WriteLine(result); } PythonEngine.Shutdown(); } } - 注意:可将Python脚本复制到C#项目的输出目录,或在
Py.Import时指定脚本完整路径。
- 打开C#项目,右键项目→「管理NuGet程序包」,搜索并安装
方案2:通过Process调用Python脚本(简单无额外依赖)
步骤:
- 修改Python脚本,支持命令行参数接收文件路径并输出结果:
# -*- coding: utf-8 -*- import fitz # PyMuPDF import openpyxl from pptx import Presentation from docx import Document import os import sys def identify_file_type(file_path): _, file_extension = os.path.splitext(file_path.lower()) if file_extension == '.pdf': return 'pdf' elif file_extension == '.xlsx': return 'excel' elif file_extension == '.pptx': return 'powerpoint' elif file_extension == '.docx': return 'word' else: raise ValueError('Tipo de arquivo não suportado.') def convert_file_to_text(file_path): file_type = identify_file_type(file_path) if file_type == 'pdf': text = '' pdf_document = fitz.open(file_path) for page_num in range(pdf_document.page_count): page = pdf_document[page_num] text += page.get_text() pdf_document.close() return text elif file_type == 'excel': workbook = openpyxl.load_workbook(file_path) text = '' for sheet_name in workbook.sheetnames: sheet = workbook[sheet_name] for row in sheet.iter_rows(values_only=True): text += ' '.join(str(cell) for cell in row) + '\n' return text elif file_type == 'powerpoint': presentation = Presentation(file_path) text = '' for slide in presentation.slides: for shape in slide.shapes: if hasattr(shape, 'text'): text += shape.text + '\n' return text elif file_type == 'word': doc = Document(file_path) text = '' for paragraph in doc.paragraphs: text += paragraph.text + '\n' return text def main(file_path): text = convert_file_to_text(file_path) print(text) # 打印结果供C#捕获 if __name__ == "__main__": if len(sys.argv) > 1: input_file_path = sys.argv[1] main(input_file_path) else: input_file_path = input("Digite o caminho completo do arquivo: ") main(input_file_path) - 在C#中使用Process调用脚本并捕获输出:
using System.Diagnostics; class Program { static void Main(string[] args) { string pythonScriptPath = @"C:\Users\PythonApp\PythonApp1.py"; string filePath = @"C:\test.pdf"; // 替换为你的Python.exe路径 string pythonExePath = @"C:\Users\<你的用户名>\AppData\Local\Programs\Python\Python311\python.exe"; ProcessStartInfo startInfo = new ProcessStartInfo { FileName = pythonExePath, Arguments = $"\"{pythonScriptPath}\" \"{filePath}\"", RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false, CreateNoWindow = true, StandardOutputEncoding = System.Text.Encoding.UTF8, StandardErrorEncoding = System.Text.Encoding.UTF8 }; using (Process process = Process.Start(startInfo)) { string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); if (!string.IsNullOrEmpty(error)) { Console.WriteLine("错误信息:" + error); } else { Console.WriteLine("转换结果:" + output); // 可将output写入文件或进一步处理 } } } }
内容的提问来源于stack exchange,提问作者Rafa3lOneiL
相关产品推荐
相关产品推荐

