在字符串之间使用环境变量?

Use environmental variables in between strings?

我有一个字符串

start = """<?xml version="1.0" encoding="utf-8" ?><soap:Envelope \
         xmlns="http://tempuri.org/"> \
                    <UserName>username</UserName><Password>password</Password>\
                    xmlns="http://tempuri.org/"><oShipData>"""

我想为用户名和密码使用环境变量,而不是在代码中对它们进行硬编码,我尝试了这个

import os
start = """<?xml version="1.0" encoding="utf-8" ?><soap:Envelope \
         xmlns="http://tempuri.org/"> \
                    <UserName>"""os.environ["username"]"""</UserName><Password>"""os.environ["password"]"""</Password>
                    xmlns="http://tempuri.org/"><oShipData>"""

但这给了我一个错误:

"errorMessage": "Syntax error in module 'test': invalid syntax (test.py, line 5)",
    "errorType": "Runtime.UserCodeSyntaxError"

如何转义字符串并从字符串中的 os.environ 动态获取值?

您可以在 python 中添加字符串。所以 "teststring" 是一个普通的字符串,但是 "test"+variable+"string" 会得到一个字符串,中间有 variable 的值,假设 variable 是 string 类型。如果不是,请使用 "test"+str(variable)+"string".

import os
start = """<?xml version="1.0" encoding="utf-8" ?><soap:Envelope \
         xmlns="http://tempuri.org/"> \
                    <UserName>"""+str(os.environ["username"])+"""</UserName><Password>"""+str(os.environ["password"])+"""</Password>
                    xmlns="http://tempuri.org/"><oShipData>"""

应该可以。

你不能只把字符串和代码放在一起,你可以用 +

将它们连接起来
start = """
<?xml version="1.0" encoding="utf-8" ?>
    <soap:Envelope xmlns="http://tempuri.org/"> 
        <UserName>""" + os.environ["username"] + """</UserName>
        <Password>""" + os.environ["password"] + """</Password>
    <oShipData>"""

你可以使用 f-strings:

import os
start = f"""<?xml version="1.0" encoding="utf-8" ?><soap:Envelope \
         xmlns="http://tempuri.org/"> \
                    <UserName>{os.environ['username']}</UserName><Password>{os.environ['password']}</Password>
                    xmlns="http://tempuri.org/"><oShipData>"""

如果您打算使用 XML 对象,最好使用一些 类 来生成 XML 文档。在 python 中有内置的 xml.etree.ElementTree.

代码:

import os
import xml.etree.ElementTree as ET

envelope = ET.Element("soap:Envelope", attrib={"xmlns": "http://tempuri.org/"})
username = ET.SubElement(envelope, "UserName")
username.text = os.environ["username"]
password = ET.SubElement(envelope, "Password")
password.text = os.environ["password"]

start = ET.tostring(envelope, encoding="utf-8", xml_declaration=True).decode()

结果:

<?xml version='1.0' encoding='utf-8'?>
<soap:Envelope xmlns="http://tempuri.org/"><UserName>user</UserName><Password>pass</Password></soap:Envelope>

P.S。在 python 3.9+ 上,您可以使用 ET.indent(envelope) 获得漂亮的打印结果 (在 ET.tostring() 调用之前插入).