Проблема запуска скрипта Python через VB - PullRequest
0 голосов
/ 16 мая 2018

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

Это делается через веб-приложение, использующее VB (на сервере IIS), и оно отлично работает , за исключением , когда я импортирую модуль Python OpenCV (импортированный в Python как cv2, более конкретно).

Что еще более запутанно, так это то, что скрипт отлично работает с импортированным модулем cv2 при запуске непосредственно из cmd. Он не работает, только когда код VB запускает скрипт, включая строку import cv2.

Для ясности я покажу код ниже.

VB-код, выполняющий скрипт Python с путем к изображению в качестве аргумента:

Dim Processtask As New System.Diagnostics.Process()
Processtask.StartInfo.FileName = "cmd.exe"
Processtask.StartInfo.Arguments = "/c python " + path.ToString + " " + ImageURL.ToString
Processtask.StartInfo.UseShellExecute = False
Processtask.StartInfo.RedirectStandardOutput = True
Processtask.StartInfo.RedirectStandardError = True
Processtask.StartInfo.CreateNoWindow = True
Processtask.Start()
Processtask.WaitForExit()
output = Processtask.StandardOutput.ReadToEnd()

Фрагмент кода Python, получающий путь к изображению:

import sys
import cv2
if __name__ == "__main__":
    im = str(sys.argv[1])
print(im)

У меня закончились возможные идеи относительно того, что может вызвать эту проблему. Любой совет будет принята с благодарностью.

EDIT

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

System.Exception: System.IO.StreamReader
System.InvalidOperationException: Process has exited, so the requested 
information is not available. 
at System.Diagnostics.Process.EnsureState(State state) at 
System.Diagnostics.Process.get_ProcessName() 
at System.Diagnostics.Process.ToString()

1 Ответ

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

В конце концов, есть решение, я выложу его здесь на случай, если кто-нибудь еще столкнется с этой проблемой:

Файлы dll opencv, установленные на сервере, на котором размещалось веб-приложение, имели разные права доступа. К файлам было отказано в доступе при вызове из веб-приложения, тогда как у остальных вызванных модулей проблем не было.

Я использовал монитор процессов sysinternals , чтобы отследить, к каким файлам было отказано в доступе, и смог вручную изменить права. Не очень элегантно, но получилось.

...