[英]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
使用RawConfigParser
,否则您必须通过加倍来转义%
。
当我使用ConfigParser
尝试示例文件时,它会出现以下异常:
InterpolationSyntaxError: '%' must be followed by '%' or '(', found: '%19u^l\\&G"'
如果我取代ConfigParser
与RawConfigParser
一切都很好。
您发布的错误与此无关。 我们甚至无法判断它是 python 异常还是 shell 错误消息。 请使用完整的错误消息更新您的问题。 您还可能要检查的sh
模块,围绕更高层次的包装subprocess
。
加上 Paulo Scardine 的评论。
如果您有需要处理的特殊字符,您可以将ConfigParser
的interpolation
参数设置为None
并且您将不再有错误。 默认情况下, ConfigParser
将interpolation
设置为BasicInterpolation()
。
您可以在此处阅读更多相关信息: https : //docs.python.org/3.6/library/configparser.html#interpolation-of-values
此外,根据文档RawConfigParser
是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
,解析器将简单地返回%(my_dir)s/Pictures
作为my_pictures
的值和%(home_dir)s/lumberjack
作为my_dir
的值。
您可以使用相同的字符转义特殊字符。 例如,为了能够读取 % 你必须写它 %%
我遇到过同样的问题。 可以理解,答案已经发布。 使用这篇文章中每个人的评论,我已经通过以下方式解决了这个问题:
我的密码是Sgf%ts54hhGtrf&yhgf
我使用的sqlalchemy.url = driver://myuser:Sgf%ts54hhGtrf&yhgf@localhost/my_application
ini 文件sqlalchemy.url = driver://myuser:Sgf%ts54hhGtrf&yhgf@localhost/my_application
收到错误: configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(',
它告诉我特殊字符是 '%'
解决了这个问题,只需将密码用单引号括起来,然后按照本文评论中的建议将 % 符号加倍,最终得到:
sqlalchemy.url = driver://myuser:'Sgf%%ts54hhGtrf&yhgf'@localhost/my_application
无需担心更改ConfigParser
,只要您坚持使用单引号将包含特殊字符的密码和在您收到的错误中发现的任何特殊字符加倍的规则,例如如果错误与%
相关,添加另一个并以%%
结束
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.