Mohammad Tavoosi Ответов: 1

Как использовать скрипт Python в моем проекте C#?


Я хочу выполнить скрипт python в моем проекте C# скрипт python имеет несколько импортированных модулей.
Я использую библиотеку ironpython в своем проекте c# и устанавливаю для нее путь к модулям python, но она не работает и выдает мне недопустимую синтаксическую ошибку;однако в самом скрипте Python ошибки нет.
Я также использую pyinstaller для создания исполняемого файла из моего скрипта python для запуска его в моем проекте c#, но выходной исполняемый файл также не работает и выдает мне ошибку "не удалось выполнить скрипт...".
Пожалуйста, помогите мне....
Обратите внимание, что я хочу иметь возможность запускать свой проект на любых компьютерах без каких-либо проблем.
Спасибо.

Что я уже пробовал:

Мои коды скриптов python:
import speaker_verification_toolkit.tools as svt
import os
def MyFile(fileName):
    THIS_FOLDER = os.path.dirname(os.path.abspath(__file__))
    my_file = os.path.join(THIS_FOLDER, fileName)
    return my_file
def GetFiles():
    Files=[]
    basepath = MyFile('voices/')
    for entry in os.listdir(basepath):
     if os.path.isfile(os.path.join(basepath, entry)):
         Files.append(os.path.join(basepath, entry))
    return Files
def FilesMFCC():
    Signals=[]
    Files=GetFiles()
    for i in Files:
        s=svt.extract_mfcc_from_wav_file(MyFile(i),16000,0.025,0.01)
        Signals.append(svt.rms_silence_filter(s,16000,None,0.001135))
    return Signals
def SetResult(distance):
    if distance<70000:
        f= open(MyFile('verifylog.txt'),"w+")
        f.write("true")
        f.close()
    else:
        f= open(MyFile('verifylog.txt'),"w+")
        f.write("false")
        f.close()
x=svt.extract_mfcc_from_wav_file(MyFile('voicein.wav'),16000,0.025,0.01)
xx=svt.rms_silence_filter(x,16000,None,0.001135)
SigList=FilesMFCC()
result=svt.find_nearest_voice_data(FilesMFCC(),xx)
rr=svt.rms_silence_filter(SigList[result],16000,None,0.001135)
f1=svt.compute_distance(xx,rr)
SetResult(f1)


Мои коды C# для запуска скрипта python:
private bool RunSpeakVerifier()
        {
            var Engine = Python.CreateEngine();
            var Script = "SpeakerVerifier.py";
            var source = Engine.CreateScriptSourceFromFile(Script);
            ICollection<string> paths = Engine.GetSearchPaths();
            string dir = @"C:\Users\Mohammad Tavoosi\AppData\Local\Programs\Python\Python38\Lib\";
            paths.Add(dir);
            string dir2 = @"C:\Users\Mohammad Tavoosi\AppData\Local\Programs\Python\Python38\Lib\site-packages";
            paths.Add(dir2);
            Engine.SetSearchPaths(paths);
            source.Execute();
            if (File.Exists("verifylog.txt"))
            {
                string txt = File.ReadAllText("verifylog.txt");
                if (txt == "true") return true;
                else return false;
            }
            else return false;
        }

Richard MacCutchan

Где происходит синтаксическая ошибка и каково точное сообщение?

Mohammad Tavoosi

Привет Синтаксическая ошибка возникает, когда я хочу запустить скрипт python в своем проекте C#. на этой линии:
источник.Выполнять();
и точное сообщение таково:
SyntaxErrorException был необработан
Необработанное исключение типа " Microsoft.Scripting.SyntaxErrorException' произошло в Microsoft.Dynamic.dll
Дополнительная информация: неверный синтаксис

1 Ответов

Рейтинг:
1

Garth J Lancaster

1) Хорошо, вы убедились, что ваш скрипт Python работает "автономно" - ТИК, хорошо

2) вы не сказали, какую версию IronPython вы используете - если я правильно понял, последняя версия IronPython реализует только Python 2.7

3) следуя из пункта 2, Ваша настройка движка добавляет Python 3.8 к путям

4) Итак, я бы гарантировал, что скрипт python содержит только совместимые конструкции Python 2.7, и обеспечил бы только настройку путей Python27 и т. д. Для скрипта

5) потерпев неудачу (4), Вы можете запустить отдельный процесс, например 'python27 SpeakerVerifier.py' (или даже 'python38 SpeakerVerifier.py') но как вы получаете данные в/из процесса и сценария будет отдельный вопрос, который будет решен