从 python 中的 .ini 文件中读取特殊字符文本

reading special characters text from .ini file in python

我是 运行 一个接受文本 "rAh%19u^l\&G" 即包含特殊字符的脚本。

当我在脚本中将此文本作为参数传递时,它运行良好,没有任何错误。

示例 - : ./abc.py <username><pwd>

以上文字基本上就是一个密码

现在,当我将值放入配置文件并阅读上面的文本时,脚本失败

*******abc.ini *******

[DEFAULT]
username = rahul
pwd =  rAh%19u^l\&G

它说

/bin/sh:M command not found.

在配置解析器的帮助下读取上述值

******下面是程序abc.py ******

#! /usr/bin/python

parser = configparser.ConfigParser()
parser.read('abc.ini')
username = parser.get('DEFAULT','username')
pwd = parser.get('DEFAULT','pwd')


p = subprocess.Popen(
    "abc.py {0} {1}" .format(username, pwd), 
    shell=True, 
    stdout=subprocess.PIPE
)

out, err = p.communicate()

print(out)

我尝试了很多搜索,但一无所获。

所以问题是如何读取 .ini 文件中包含特殊字符的文本。

看起来 % 字符是这里的问题。如果您使用 ConfigParser,它有特殊的含义。如果您不使用插值,则只使用 RawConfigParser 代替,否则您必须通过加倍来转义 %

当我使用 ConfigParser 尝试示例文件时,它会出现以下异常:

InterpolationSyntaxError: '%' must be followed by '%' or '(', found: '%19u^l\&G"'

如果我用 RawConfigParser 替换 ConfigParser 一切都很好。

您发布的错误与此无关。我们甚至无法判断它是 python 异常还是 shell 错误消息。请使用完整的错误消息更新您的问题。您还可以 want to check the sh modulesubprocess.

的更高级别包装器

添加 Paulo Scardine 的评论。

如果你有需要处理的特殊字符,你可以将ConfigParserinterpolation参数设置为None,你就不会再有错误了。默认情况下,ConfigParserinterpolation 设置为 BasicInterpolation()

您可以在此处阅读更多相关信息: https://docs.python.org/3.6/library/configparser.html#interpolation-of-values

此外,根据文档 RawConfigParserLegacy variant of the ConfigParser with interpolation disabled by default and unsafe add_section and set methods.

这是其中的一个片段:

示例:

[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures

在上面的示例中,将插值设置为 BasicInterpolation() 的 ConfigParser 会将 %(home_dir)s 解析为 home_dir 的值(在本例中为 /Users)。 %(my_dir)s 实际上会解析为 /Users/lumberjack。 [....]

将插值设置为 None,解析器将简单地将 return %(my_dir)s/Pictures 作为 my_pictures 的值,将 %(home_dir)s/lumberjack 作为 my_dir.

您可以使用相同的字符转义特殊字符。例如,为了能够读取 %,您必须将其写入 %%

我也遇到过同样的问题。可以理解的是,答案已经 posted。根据大家对此 post 的评论,我通过以下方式解决了这个问题:

我的密码是 Sgf%ts54hhGtrf&yhgf

我使用的 alembic ini 文件:sqlalchemy.url = driver://myuser:Sgf%ts54hhGtrf&yhgf@localhost/my_application

收到错误:configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', 告诉我特殊字符是“%”

通过将密码用单引号引起来解决了这个问题,并按照此 post 中评论的建议将 % 符号加倍以结束:

sqlalchemy.url = driver://myuser:'Sgf%%ts54hhGtrf&yhgf'@localhost/my_application

无需担心更改 ConfigParser 只要您坚持将包含特殊字符的密码用单引号括起来的规则,并将您收到的错误中发现的任何特殊字符加倍,例如如果错误与 % 有关,请添加另一个并以 %%

结尾