Есть ли способ вызвать скрипт Python, который модифицирует XML с помощью ElementTree, из кода C #? - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть реализованный скрипт на python, который изменяет локальный XML-файл, получая значения из другого локального XML-файла, используя ElementTree.Мне нужно реализовать графический интерфейс для всего этого.Итак, я выбрал Visual C #> Рабочий стол Windows> Приложение Windows Forms .Здесь я мог бы сделать простой графический интерфейс, где код вызывает скрипт Python с использованием IronPython.Похоже, что IronPython не поддерживает ElementTree.Вот где проблема.

Использование Visual Studio Community 2017. Итак, добавлена ​​разработка Python при установке.Также в ссылках на проект добавлен IronPython с помощью «Управление пакетами Nuget».Но не смог добавить туда python, так как он сказал

"Не удалось установить пакет 'python 3.7.2'. Вы пытаетесь установить этот пакет в проект, нацеленный на .NETFramework, Version = v4.6.1 ', но пакет не содержит никаких ссылок на сборки или файлов содержимого, совместимых с этой платформой. Для получения дополнительной информации свяжитесь с автором пакета. "

Независимо от этого, выполнялся код Pythonсоздавая движокНо когда был запущен скрипт python, который использовал elementtree, я получил ошибку

«Исключение:« IronPython.Runtime.Exceptions.ImportException »в Microsoft.Dynamic.dll Нет модуля с именем xml.etree.ElementTree ".

Хотя код работает отлично, при запуске напрямую из оболочки Python.После этого я погуглил и нашел способ:

paths.Add(@"C:\Users\suddin\AppData\Local\Programs\Python\Python37-32\Lib");
engine.SetSearchPaths(paths);

Но теперь новая ошибка:

"Возникло исключение:" Microsoft.Scripting.SyntaxErrorException "в Microsoft.Dynamic.dll неожиданный токен 'из' "

FullInstallation.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using IronPython.Hosting;

namespace Installer
{
    public partial class FullInstallation : Form
    {
        public FullInstallation()
        {
            InitializeComponent();
        }

        private void Install_Click(object sender, EventArgs e)
        {
            var engine = Python.CreateEngine();
            var paths = engine.GetSearchPaths();
                        paths.Add(@"C:\Users\suddin\AppData\Local\Programs\Python\Python37-32\Lib");
        engine.SetSearchPaths(paths);
            try
            {
                engine.ExecuteFile("I:\\Python\\XML     Parser\\BW_Config_ConfigureCode.py");
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message.ToString());
            }
        }
    }
}

Python-скрипт:

import xml.etree.ElementTree as ET

# Welcome! In this file, we configure all the tags of BW_Config.xml, which are there in the file BW_Config_Installer_Configurations.xml
# We parse 2 xml files in this code.
# First is the BW_Config.xml which we need to configure
# Second is the BW_Config_Installer_Configurtion.xml which contains the information about which tags are to be configured in the BW_Config.xml

BW_Config_tree = ET.parse('BW_Config_for_parsing_practice.xml')  # parsed BW_Config.xml
BW_Config_root = BW_Config_tree.getroot()

# parsed BW_Config_Installer_Configurations.xml
installer_config_tree =ET.parse('BW_Config_Installer_Configurations.xml')
installer_config_root = installer_config_tree.getroot()
i = 0
# This loop will traverse all the tags which need to be cofigured, one by one
for configurable_tag in installer_config_root.findall("./BW_Config/"):
    # This variable will contain the name of the tag to be configured in each iteration
    configurable_tagname = configurable_tag.tag
    # This variable will contain the path of the tag inside BW_Config.xml, in each iteration
    configurable_tagpath = configurable_tag.attrib["xpath"]
    # This variable will contain the data about what is to be configure in the tag, in each iteration
    configurable_tagattribute = configurable_tag.attrib["property"]
    # This variable will be set to "yes", if the respective tag is to be changed, else "no"
    configurable_tagchoice = configurable_tag.attrib["configurable"]
    # This variable will contain the new value for the respective tag
    configurable_tagnewvalue = configurable_tag.attrib["value"]
    i = i + 1  # It is used just to maintain the number of iterations and for user friendly console display
    # Printing which tag we will be dealing with in this iteration
    print(i, configurable_tagname)
    print("\n")

....

Как использовать Python (с elementTree), который вызывается из C #?Или есть другой способ, кроме IronPython или чего-то еще?

...