如何通过c#在python/propy脚本中启动函数?

问题描述 投票:0回答:1

我的 python 脚本 (c:\Temp\StartPython est.py) 如下所示:

import arcpy
import string, sys, os
import ctypes

logfile ="C:\\Temp\\StartPython\\Logfile.log"

def Main(dataset):
    print ("Started with argument " + dataset)
    datei = open(logfile,'a')
    datei.write("Started with argument " + dataset)

我想通过 C# 从脚本启动“main”函数。为此,我必须使用 ArcGis Pro 使用的 propy.bat 为 phython 建立 CONDA 环境。

@echo off
@CALL :normalizepath scripts_path "%~dp0"

:: get the active environment from PythonEnvUtils.exe
FOR /F "delims=" %%i IN ('"%scripts_path%..\..\PythonEnvUtils.exe"') DO set CONDA_NEW_ENV=%%i

@set CONDA_SKIPCHECK=1
@set "CONDA_PREFIX=%CONDA_NEW_ENV%"

@set "CONDA_BACKUP_PATH=%PATH%"
@SET "activate_path="%scripts_path%activate.bat" "%CONDA_NEW_ENV%"
@set "deactivate_path="%scripts_path%deactivate.bat""
@call %activate_path%
python.exe %*
@set PY_ERRORLEVEL=%ERRORLEVEL%
@call %deactivate_path%
@set "PATH=%CONDA_BACKUP_PATH%"
@set "CONDA_BACKUP_PATH="

@exit /b %PY_ERRORLEVEL%

:normalizepath
    @set "%1=%~dpfn2"
    @exit /b

我能够创建一个用于启动脚本的类,如下所示:

internal class RunProcess
{
    private Process _process;
    private StringBuilder _sbOut = new StringBuilder();
    private StringBuilder _sbError = new StringBuilder();

    public (string Output, string Error, int ErrCode) RunProcessGrabOutput(string Executable, string Arguments, string WorkingDirectory)
    {
        int exitCode = -1;
        try
        {
            _sbOut.Clear();
            _sbError.Clear();
            _process = new Process();
            _process.StartInfo.FileName = Executable;
            _process.StartInfo.UseShellExecute = false;
            _process.StartInfo.WorkingDirectory = WorkingDirectory;
            _process.StartInfo.RedirectStandardInput = true;
            _process.StartInfo.RedirectStandardOutput = true;
            _process.StartInfo.RedirectStandardError = true;
            _process.StartInfo.StandardErrorEncoding = Encoding.UTF8;
            _process.StartInfo.StandardOutputEncoding = Encoding.UTF8;
            _process.StartInfo.CreateNoWindow = true;
            _process.StartInfo.EnvironmentVariables.Add("PYTHONUNBUFFERED", "TRUE");

            if (!string.IsNullOrEmpty(Arguments))
                _process.StartInfo.Arguments = Arguments;

            _process.EnableRaisingEvents = true;
            _process.OutputDataReceived += new DataReceivedEventHandler(ProcessOutputHandler);
            _process.ErrorDataReceived += new DataReceivedEventHandler(ProcessErrorHandler);
            _process.Start();

            _process.BeginOutputReadLine();
            _process.BeginErrorReadLine();

            // You can set the priority only AFTER the you started the process.
            _process.PriorityClass = ProcessPriorityClass.BelowNormal;
            _process.WaitForExit();
            exitCode = _process.ExitCode;
        }
        catch
        {
            // This is how we indicate that something went wrong.
            throw;
        }

        return (_sbOut.ToString(), _sbError.ToString(), exitCode);
    }

    private void ProcessOutputHandler(object SendingProcess, DataReceivedEventArgs OutLine)
    {
        _sbOut.AppendLine(OutLine.Data);
    }

    private void ProcessErrorHandler(object SendingProcess, DataReceivedEventArgs OutLine)
    {
        _sbError.AppendLine(OutLine.Data);
    }
}

这就是我尝试启动脚本的方式:

var executable = "C:\\Program Files\\ArcGIS\\Pro\\bin\\Python\\Scripts\\propy.bat";
var workingDir = "C:\\Program Files\\ArcGIS\\Pro\\bin";

var myArguments = "\"C:\\Temp\\StartPython\\test.py\" \"C:\\somePath\" ";


var process = new RunProcess();
var processOutcome = process.RunProcessGrabOutput(executable,
myArguments, workingDir);

RunProcessGrabOutput 将持续约 1 秒,之后不会写入任何日志文件,并且 processOutcome 有点空:

processOutcome  ("\r\n", "\r\n", 0) (string Output, string Error, int ErrCode)
python c# conda arcgis
1个回答
0
投票

经过一番搜索,我在这里找到了答案从命令行运行函数

这就是我调用该函数的方式:

var executable = "C:\\Program Files\\ArcGIS\\Pro\\bin\\Python\\Scripts\\propy.bat";
var workingDir = "C:\\Daten\\RadSvn\\Prototypes\\StartPythonScript\\StartPythonScript\\Scripts";

var myArguments = "-c \"from Test import Main;Main('Hallo')\"";


var process = new RunProcess();
var processOutcome = process.RunProcessGrabOutput(executable,
myArguments, workingDir);
© www.soinside.com 2019 - 2024. All rights reserved.