文字列から、MathMLのコードを生成するプログラムtest001.py
を書いています。

test001.py

import sys
sys.path.append('/home/vagrant/.local/lib/python3.4/site-packages')
from sympy import *
from sympy.printing.mathml import mathml

def returnMathML(value):
    str = "<math>"
    if '=' in value:#文字列中に=(イコール)が含まれている場合
        str += mathml(Eq(*map(sympify, value.split('='))),printer='presentation')
    else:
        str += mathml(sympify(value),printer='presentation')
    str += "</math>"
    return str

print(returnMathML("A"))

test001.pyを実行すると、以下のようにMathMLのコードが出力されます。

<math><mi>A</mi></math>

test001.pyの15行目で、渡す引数を"y=a*x**2+b*x+c"に変更して以下のように書き換えて実行してもMathMLのコードが出力されます。

・引数を"y=a*x**2+b*x+c"に変更した場合

print(returnMathML("y=a*x**2+b*x+c"))

・引数を"y=a*x**2+b*x+c"に変更した場合の実行結果

$ python test001.py
<math><mrow><mi>y</mi><mo>=</mo><mrow><mrow><mi>a</mi><mo>&InvisibleTimes;</mo><msup><mi>x</mi><mn>2</mn></msup></mrow><mo>+</mo><mrow><mi>b</mi><mo>&InvisibleTimes;</mo><mi>x</mi></mrow><mo>+</mo><mi>c</mi></mrow></mrow></math>

 ただ、文字列に大文字の"S"が加わると、エラーが出てしまいます。

・引数を"S"に変更した場合

print(returnMathML("S"))

・引数を"S"に変更した場合の実行結果

$ python test001.py
Traceback (most recent call last):
  File "test001.py", line 15, in <module>
    print(returnMathML("S"))
  File "test001.py", line 11, in returnMathML
    str += mathml(sympify(value),printer='presentation')
  File "/home/vagrant/.pyenv/versions/3.6.7/lib/python3.6/site-packages/sympy/printing/mathml.py", line 1904, in mathml
    return MathMLPresentationPrinter(settings).doprint(expr)
  File "/home/vagrant/.pyenv/versions/3.6.7/lib/python3.6/site-packages/sympy/printing/mathml.py", line 68, in doprint
    unistr = mathML.toxml()
AttributeError: 'str' object has no attribute 'toxml'

 これはおそらく、sympify関数のエイリアスが「S」であるため、名前かぶりが起きているんではないかと思います。

 大文字のS以外の、BやCやDといったアルファベットはprintすることが出来ました。また、小文字のsなども大丈夫でした。大文字のSだけがうまく出力できません。

 以下のように、面積の"S"を表すのに使用したいです。

print(returnMathML("S=abs(a)*(β-α)**3/6"))

どうすればこの問題を解決できますでしょうか?