Невозможно передать аргументы с пробелами в скрипт Python из C#

Я вызываю скрипт Python из С # с помощью метода ProcessInfoStart. В качестве аргумента он получает JSON и вводится в скрипт python.

Он отлично работает, мы передаем JSON без пробелов, но если есть какое-либо пространство, тогда исходный JSON разделяется до пробела и передается как аргумент, а остальные игнорируются

public static bool ExecutePythonScript(string jRequest, string fileType)
{
    string pythonExePath = Convert.ToString(ConfigurationManager.AppSettings["PythonExe"]);
    bool bIsExecutionSuccess = true;
    try
    {
        var psi = new ProcessStartInfo();
        psi.FileName = pythonExePath;
        var script = @"C:Scripts\pdf-to-csv.py";

        psi.Arguments = $"\"{script}\" \"{jRequest}\"";

        psi.UseShellExecute = false;
        psi.CreateNoWindow = true;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;

        var errors = "";
        var results = "";
        using (var process = Process.Start(psi))
        {
            errors = process.StandardError.ReadToEnd();
            results = process.StandardOutput.ReadToEnd();
        }

        if (!string.IsNullOrEmpty(errors))
            bIsExecutionSuccess = false;
    }
    catch(Exception ex)
    {
        bIsExecutionSuccess = false;
    }
    return bIsExecutionSuccess;
}

Скрипт Python для приема аргументов

input_params = sys.argv[1]
input_params = input_params.replace("'",'"')
data_params = json.loads(input_params)

Есть ли способ передать jRequest с пробелами в скрипт python.

2 ответа

Параметры скрипта Python можно заключить в одинарные кавычки, чтобы прочитать всю строку, включая пробелы.

Попробуйте заключить строку JSON в одинарные кавычки.

Мне пришлось использовать двойные кавычки вокруг аргументов, чтобы весь аргумент с пробелами передавался в скрипт Python.

      Process p = new()
        {
            StartInfo = new ProcessStartInfo(pythonPath, "queryDb.py \"" + query + "\"")
            {
                UseShellExecute = false,
                RedirectStandardOutput = true,
                WorkingDirectory = "C:\\Users\\Sora Teichman\\source\\repo"
            }
        };
        p.Start();

Обязательно экранируйте двойные кавычки обратной косой чертой.

Другие вопросы по тегам