在Pro 3.0上运行丙基。bat

201
4
跳到解决方案
10-28-2022 09:21 am
TomCox
通过
新贡献者III

我正在将各种添加应用程序迁移到Pro 3.0,并且在从我的Pro应用程序运行python脚本时遇到了痛苦。

我依赖于调用“丙基”例程来运行python脚本的方法。这在Pro 2上一直很好用。在各种。net框架下的x系列。我猜想。net核心在这方面引入了一些变化。

为了确保python脚本本身在我的Pro 3.0环境中能够正常运行,我在Pro中通过python窗口交互式地运行了该脚本,结果运行正常。

当我运行应用程序并通过丙基bat调用脚本时,它从不返回值。我已经在任务管理器中监控了这一点,可以看到Python任务开始并开始消耗cpu。然而,
它永远不会返回一个值,任务管理器中的python任务仍然消耗0%的cpu。

我尝试通过简单地启动进程,而不使用标准输出的“ReadToEnd”来调整进程调用方式的语句。这导致脚本成功运行。然而,在这种配置中,我无法在应用程序和python代码中“等待”它。我在互联网上看了一下,并试图实施一些不同的方法,但没有运气。

下面的方法是我如何成功地在2点调用它的。X在“旧”框架下。在全新的3.0 / . net核心世界中,它处理"result = reader.ReadToEnd();"并且永远不会返回。没有创建python文件的预期输出。

public async Task run_arcpyReturnSurfaceProcessingResultsString(string pythonFile) {string result = "";await QueuedTask.Run(() => {GC.Collect();ProcessStartInfo start = new ProcessStartInfo();开始。CreateNoWindow = true;开始。FileName = @"c:\Program Files\ArcGIS\Pro\bin\Python\scripts\丙基.bat";开始。参数=字符串。格式(“{0}”,pythonFile); start.UseShellExecute = false; start.RedirectStandardOutput = true; using (Process process1 = Process.Start(start)) { using (StreamReader reader = process1.StandardOutput) { result = reader.ReadToEnd(); reader.Close(); process1.Close(); return result; } } }); return result; }

任何见解都是受欢迎的。

0荣誉
1解决方案

接受的解决方案
狼
通过 金宝搏吧
金宝搏吧

除了查理的回答,这里还有一个arcpy工具箱样本:

arcgis-pro-sdk-community-samples/Geoprocessing at master·Esri/arcgis-pro-sdk-community-samples (gi…

这个示例将添加一个带有py脚本的工具箱到ArcGIS Pro:

wolf_0 - 1666993841183. - png

我修改了示例并添加了一个按钮,该按钮将从。net调用工具箱中的py脚本:

wolf_1 - 1666994281684. - pngwolf_2 - 1666994314950. - png

我附上了样品溶液。

在原帖子中查看解决方案

0荣誉
4回复
CharlesMacleod
金宝搏吧

我不能用批处理文件复制-抱歉不是python程序员。我做了一件不同的事情是删除QueuedTask,但我认为这是不相关的。

顺便说一句,我确实找到了一些关于解决阅读标准问题的其他建议:https://stackoverflow.com/questions/1145969/processinfo-and-redirectstandardoutput

@echo这是一个测试ECHO %0 %1

字符串结果= "";ProcessStartInfo start = new ProcessStartInfo();开始。CreateNoWindow = true;开始。FileName = @"E:\Data\SDK\Test\TestAddin\TestStdout.bat";开始。Arguments = "Hello";开始。UseShellExecute = false; start.RedirectStandardOutput = true; using (Process process1 = Process.Start(start)) { using (StreamReader reader = process1.StandardOutput) { result = reader.ReadToEnd(); reader.Close(); process1.Close(); //return result; } } System.Diagnostics.Debug.WriteLine(result); //return result;

batch_file_cmd_prompt2.png

batch_file_cmd_prompt.png

0荣誉
狼
通过 金宝搏吧
金宝搏吧

除了查理的回答,这里还有一个arcpy工具箱样本:

arcgis-pro-sdk-community-samples/Geoprocessing at master·Esri/arcgis-pro-sdk-community-samples (gi…

这个示例将添加一个带有py脚本的工具箱到ArcGIS Pro:

wolf_0 - 1666993841183. - png

我修改了示例并添加了一个按钮,该按钮将从。net调用工具箱中的py脚本:

wolf_1 - 1666994281684. - pngwolf_2 - 1666994314950. - png

我附上了样品溶液。

0荣誉
TomCox
通过
新贡献者III

绅士,

非常感谢你的参与。我审查了Charlie的测试,使用相同的代码调用不同的bat文件,该文件只是回显结果并得到与Charlie相同的结果,因此该方法使用的方法似乎是“有效的”。

我非常欣赏将脚本绑定到工具的想法。我会在上面磨磨蹭蹭,看看会有什么结果。

非常感谢你们两位的及时回复。除了这个小故障,向3.0的迁移似乎进展得相当顺利。

我将带着工具绑定方法的结果回到这个线程。

干杯

0荣誉
TomCox
通过
新贡献者III

绅士,

再次感谢你的助攻。我能够模仿沃尔夫的方法,一切看起来都很好。它在解决方案中引入了更多的东西,但它是正常的。我有一些其他的应用程序,正在呼吁脚本,希望能效仿。

不确定是什么原因导致之前的技术在3.0时失败,但可以用它过完整的生活。

再次感谢您的快速回复。

0荣誉