C#调用Arcpy+Python脚本
C#调用Arcpy+Python脚本
利用c#+Winform+cmd搭建界面和传参,利用Arcpy+Python脚本执行任务,监听脚本的返回值判断程序是否执行完毕!注意事项:
- 脚本必须正常执行,在cmd下面也能正常执行;
- 传参的参数间要用空格。
例子:
- ArcpyForm.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Configuration;
namespace exe
{
public partial class ArcpyForm : Form
{
delegate void SetTextHander(string recvStr);//带参数
private void SetText(string recvStr)
{
if (richTextBox1.InvokeRequired)//判断是否是线程在访问该控件
{
SetTextHander set = new SetTextHander(SetText);//委托的方法参数应和SetText一致
richTextBox1.Invoke(set, recvStr); //委托自身,递归委托,直到不是以invoke方式去访问控件
}
else
{
richTextBox1.SelectionColor = Color.Red;
richTextBox1.AppendText(Thread.CurrentThread.ManagedThreadId + "回调结束------------" + DateTime.Now.Second.ToString() + ":" + DateTime.Now.Millisecond.ToString() + "------------------------------------------\r\n");
richTextBox1.SelectionColor = Color.Blue;
richTextBox1.AppendText(recvStr + "\r\n");
}
}
public ArcpyForm()
{
InitializeComponent();
}
/// <summary>
/// 不带参数执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tlSBtn_Start_Click(object sender, EventArgs e)
{
richTextBox1.Clear();
string pythonexe = ConfigurationManager.AppSettings["pythonexe"].ToString();
string python = ConfigurationManager.AppSettings["python"].ToString();
string pythonDir = ConfigurationManager.AppSettings["pythonDir"].ToString();
string pythonScriptPath = pythonDir; //AppDomain.CurrentDomain.BaseDirectory;//python脚本所在的目录
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = pythonexe; //@"C:\SoftWare\ArcGis\ArcGIS10.1\python.exe";//执行python.exe
//执行python脚本的命令
start.Arguments = python;// pythonScriptPath + "pythonGUI.py";
//设置运行python脚本的初始目录 这里注意:如果你的python脚本有文件操作,必须设置初始目录
start.WorkingDirectory = pythonScriptPath;
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
using (Process process = Process.Start(start))
{
// 异步获取命令行内容
process.BeginOutputReadLine();
// 为异步获取订阅事件
process.OutputDataReceived += new DataReceivedEventHandler((sender1, e1) =>
{
SetText(e1.Data);
});
}
}
/// <summary>
/// 带参数执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tlSBtn_Start_Argv_Click(object sender, EventArgs e)
{
richTextBox1.Clear();
string pythonexe = ConfigurationManager.AppSettings["pythonexe"].ToString();
string python = ConfigurationManager.AppSettings["python"].ToString();
string pythonDir = ConfigurationManager.AppSettings["pythonDir"].ToString();
string parameters = ConfigurationManager.AppSettings["parameters"].ToString();
string pythonScriptPath = pythonDir; //AppDomain.CurrentDomain.BaseDirectory;//python脚本所在的目录
ProcessStartInfo start = new ProcessStartInfo();
start.FileName = pythonexe; //@"C:\SoftWare\ArcGis\ArcGIS10.1\python.exe";//执行python.exe
//执行python脚本的命令
start.Arguments = python + " " + parameters;// pythonScriptPath + "pythonGUI.py";
//设置运行python脚本的初始目录 这里注意:如果你的python脚本有文件操作,必须设置初始目录
start.WorkingDirectory = pythonScriptPath;
start.UseShellExecute = false;
start.CreateNoWindow = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
using (Process process = Process.Start(start))
{
// 异步获取命令行内容
process.BeginOutputReadLine();
// 为异步获取订阅事件
process.OutputDataReceived += new DataReceivedEventHandler((sender1, e1) =>
{
SetText(e1.Data);
});
}
}
}
}
- App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<!--python.exe-->
<add key="pythonexe" value="C:\SoftWare\ArcGis\ArcGIS10.1\python.exe"/>
<!--*.py-->
<add key="python" value="F:\Project\exe\exe\bin\Debug\pythonGUIArgv.py"/>
<!--*.py目录-->
<add key="pythonDir" value="F:\Project\exe\exe\bin\Debug" />
<!--python参数,参数之间留一个空格-->
<add key="parameters" value="C:\Users\Administrator\Desktop\y\33 C:\Users\Administrator\Desktop\y\ee\1.mdb" />
</appSettings>
<system.windows.forms jitDebugging="true" />
</configuration>
- pythonGUI.py 脚本
# coding=utf-8
import arcpy
import string
import sys
try:
workspace =r'C:\Users\Administrator\Desktop\y\33'
outdb1 = r"C:\Users\Administrator\Desktop\y\ee\1.mdb"
arcpy.env.workspace = workspace
files = arcpy.ListFiles("*.*db")
arcpy.env.workspace = outdb1
fcs = arcpy.ListFeatureClasses()
fcs = fcs + arcpy.ListTables()
dss = arcpy.ListDatasets()
for File in files:
print File
for fc in fcs:
arcpy.Append_management(workspace + "\\" + File + "\\" + fc, outdb1 + "\\" + fc)
for ds in dss:
fcs1 = arcpy.ListFeatureClasses(feature_dataset=ds)
for fc1 in fcs1:
print fc1
arcpy.Append_management(workspace + "\\" + File + "\\" + ds + "\\" + fc1, outdb1 + "\\" + ds + "\\"+fc1)
except arcpy.ExecuteError:
print arcpy.GetMessages()
- 效果图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程