Можно ли запустить код Python, хранящийся в xml cdata? - PullRequest
1 голос
/ 21 октября 2019

У меня есть XML-файл, который содержит код Python в одном из тегов

    <codeBlocks><!--The codeBlocks contains specific code for this layer -->
        <codeblock name="getXYofFeature2">
        <![CDATA[
        def fun():
         print("in fun")
        ]]>
        </codeblock>        
    </codeBlocks>

    cb = y.codeBlocks.find('codeblock',{'name':'getXYofFeature2'}).text
    print(cb)
    '\n\t\t\n\t\tdef fun():\n\t\t print("in fun")\n\t\t\n\t\t'

Я хотел бы запустить фрагмент кода с именем getXYofFeature2 в моем скрипте Python,Когда я пытаюсь запустить следующее

>     exec(cb) 

, я получаю следующее сообщение об ошибке

exec(cb)   File "<string>", line 3
>     def fun():
>     ^ IndentationError: unexpected indent

Возможно ли выполнить код, хранящийся в CDATA, в файле XML? Если да, то какой путь лучше?

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Да, это возможно. Следующий фрагмент кода выводит «в шутку»:

import xml.etree.ElementTree as ET
import textwrap

XML = """
    <codeBlocks><!--The codeBlocks contains specific code for this layer -->
        <codeblock name="getXYofFeature2">
        <![CDATA[
        def fun():
         print("in fun")
        fun()
        ]]>
        </codeblock>        
    </codeBlocks>"""

codeBlocks = ET.fromstring(XML)
cb = codeBlocks.find('codeblock').text
exec(textwrap.dedent(cb))

Обратите внимание, что был добавлен вызов функции fun() и что textwrap.dedent() используется для удаления начальных пробелов.

1 голос
/ 21 октября 2019

Вы можете использовать exec () для выполнения любой строки в качестве кода Python.

Просто убедитесь, что отступ для извлеченной строки в порядке.

Также убедитесь, что вы задаете для него требуемыйконтекст (возможно, некоторые глобальные или внешние переменные)

Это хорошая идея для выполнения кода Python, хранящегося в XML?

Это зависит от того, кто создал XML.

ЕслиВы полностью доверяете человеку, который поместил код Python в XML, тогда да.

Или сказать иначе. Если вы дадите человеку, который может вставить код Python в полную оболочку XML, доступ к машине, на которой ваш код Python работает без колебаний, то это нормально.

В противном случае такой подход имеет огромное влияние на безопасность.

Обратите внимание, что исходный код также может быть сохранен в базе данных в полочном файле или аналогично.

...