Запуск сценария python с аргументами на c# и сбой, когда на cmd нет - PullRequest
0 голосов
/ 02 мая 2020

каким-то образом я запускаю скрипт python с аргументами, на cmd работает отлично, но когда я передаю его через мой C#, кажется, что он не передает аргументы правильно.

Cmd приводит:

C:\Users\Sick\source\repos\phoneScraper\phoneScraper\bin\Debug\netcoreapp3.1\Captchas>script.py dztfi.png 
mysycd

Код:

static string run_cmd(string arg) // arg value = image.png
    {
        string result = ""; 
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = @"C:\Users\Sick\AppData\Local\Programs\Python\Python38-32\python.exe";//cmd is full path to python.exe
        start.Arguments = "Captchas/script.py " + arg;//args is path to .py file and any cmd line args
        start.UseShellExecute = false;
        start.RedirectStandardOutput = true;
        using (Process process = Process.Start(start))
        {
            using (StreamReader reader = process.StandardOutput)
            {
                result = reader.ReadToEnd();
                Console.WriteLine(result);
            }
        }
        return result;
    }

    c# error:
Traceback (most recent call last):
  File "Captchas/script.py", line 11, in <module>
    close = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\core\src\matrix.cpp:757: error: (-215:Assertion failed) dims <= 2 && step[0] > 0 in function 'cv::Mat::locateROI'

Python Код:

import cv2
import numpy as np
import pytesseract
import sys

img = cv2.imread(sys.argv[1], cv2.IMREAD_GRAYSCALE)

img = cv2.bitwise_not(img)

kernel = np.ones((7, 7), np.uint8)
close = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
newkernel = np.ones((5, 5), np.uint8)
inv = cv2.erode(close, newkernel, iterations=1)

inv = cv2.bitwise_not(inv)

custom_config = r'-l eng --oem 3 --psm 7 -c tessedit_char_whitelist="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"'
text = pytesseract.image_to_string(inv, config=custom_config)
print(text)

Спасибо!

1 Ответ

1 голос
/ 02 мая 2020

Вы должны указать рабочий каталог ProcessStartInfo. Например, вы используете Application.StartupPath в вашем приложении. Но это зависит от того, где начинается ваше приложение. Поэтому, если вы запускаете свое приложение из cmd, я думаю, что python .exe запускает ваш скрипт. Но ваше приложение начинается там, где ваши скрипты. Поэтому попробуйте скрипт дать каталог скриптов.

static string run_cmd(string arg) // arg value = image.png
{
    string result = ""; 
    ProcessStartInfo start = new ProcessStartInfo();
    start.FileName = @"C:\Users\Sick\AppData\Local\Programs\Python\Python38-32\python.exe";//cmd is full path to python.exe
    start.Arguments = "Captchas/script.py " + arg;//args is path to .py file and any cmd line args
    start.UseShellExecute = false;
start.WorkingDirectory = ""//scriptPath
    start.RedirectStandardOutput = true;
    using (Process process = Process.Start(start))
    {
        using (StreamReader reader = process.StandardOutput)
        {
            result = reader.ReadToEnd();
            Console.WriteLine(result);
        }
    }
    return result;
}

Для получения дополнительной информации посетите здесь: https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.processstartinfo.workingdirectory?view=netcore-3.1

...