从 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
module,subprocess
.
的更高级别包装器
添加 Paulo Scardine 的评论。
如果你有需要处理的特殊字符,你可以将ConfigParser
的interpolation
参数设置为None
,你就不会再有错误了。默认情况下,ConfigParser
将 interpolation
设置为 BasicInterpolation()
。
您可以在此处阅读更多相关信息:
https://docs.python.org/3.6/library/configparser.html#interpolation-of-values
此外,根据文档 RawConfigParser
是 Legacy 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
只要您坚持将包含特殊字符的密码用单引号括起来的规则,并将您收到的错误中发现的任何特殊字符加倍,例如如果错误与 %
有关,请添加另一个并以 %%
结尾
我是 运行 一个接受文本 "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
module,subprocess
.
添加 Paulo Scardine 的评论。
如果你有需要处理的特殊字符,你可以将ConfigParser
的interpolation
参数设置为None
,你就不会再有错误了。默认情况下,ConfigParser
将 interpolation
设置为 BasicInterpolation()
。
您可以在此处阅读更多相关信息: https://docs.python.org/3.6/library/configparser.html#interpolation-of-values
此外,根据文档 RawConfigParser
是 Legacy 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
只要您坚持将包含特殊字符的密码用单引号括起来的规则,并将您收到的错误中发现的任何特殊字符加倍,例如如果错误与 %
有关,请添加另一个并以 %%