использовать настраиваемый модуль python в скрипте, запущенном из c# - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь запустить сценарий python из консольного приложения c#. Этот код c# работает нормально, пока я не импортирую наш пользовательский модуль python, который, в свою очередь, импортирует другие модули, например arcpy, keyring и т.д. c внутри сценария python. Скрипт отлично работает из строки cmd, но однажды в c# он просто зависает. В итоге выскакивает системная ошибка взаимоблокировки. Как заставить мой python работать? Цель - получить пароль от python до c#. Я открыт для других подходов ...

c#

        private static string getPassword(string database)
        {
            ProcessStartInfo start = new ProcessStartInfo();
            start.FileName = @"C:\Python27\ArcGIS10.6\python.exe";
            string script = @"C:\src\xxxx\etw_password.py";
            start.Arguments = $"\"{script}\" \"{database}\"";
            start.UseShellExecute = false;
            start.CreateNoWindow = false;
            start.RedirectStandardOutput = true;
            start.RedirectStandardError = true;
            string errors;
            string password;
            Console.WriteLine(start.Arguments);
            using(Process process = Process.Start(start))
            {
                errors = process.StandardError.ReadToEnd();
                password = process.StandardOutput.ReadToEnd();
            }


            return password;
        }

python: не работает - я заменил наши пользовательские вызовы безопасности python на «x»

import sys
import xxxx

database = sys.argv[1]
password = xxxx.xxxx(database, 'xxxx')
print password

python: отлично работает

import sys

database = sys.argv[1]
print database

Я также провожу тест ниже, чтобы проверить, был ли это только наш модуль или проблема распространилась на другие. Я тестировал с numpy и arcpy. Оба вышли из строя.

python: не работает

import sys
import numpy

database = sys.argv[1]
print database

1 Ответ

0 голосов
/ 29 мая 2020

Проблема в вашем скрипте, а не в C#. Ваш код C# правильно сформирован и работает (я проверил его, заменив ваш скрипт скриптом hello world, который принимает один аргумент и правильно распечатывает результат).

Если вы говорите он работает в командной строке, тогда может быть важно отметить, по какому пути вы запускаете скрипт. Ваш сценарий может содержать зависимости относительного пути. Это, в свою очередь, повлияет на код C#, потому что вам может потребоваться сначала начать с этого каталога.

Если вам нужен мой тест, вот он:

script.py:

import sys

database = sys.argv[1]
print("Hello, " + database)

Program.cs:

        static void Main(string[] args)
        {
            var pwd = getPassword("World!");
            Console.WriteLine($"OUTPUT: {pwd}");
        }

        private static string getPassword(string database)
        {
            ProcessStartInfo start = new ProcessStartInfo();
            start.FileName = @"C:\Users\<path-to-my>\python.exe";
            string script = @"C:\<path-to-my>\script.py";
            start.Arguments = $"\"{script}\" \"{database}\"";
            start.UseShellExecute = false;
            start.CreateNoWindow = false;
            start.RedirectStandardOutput = true;
            start.RedirectStandardError = true;
            string errors;
            string password;
            Console.WriteLine(start.Arguments);
            using (Process process = Process.Start(start))
            {
                errors = process.StandardError.ReadToEnd();
                password = process.StandardOutput.ReadToEnd();
            }

            return password;
        }

Вывод:

enter image description here

...